0

関数boundsInLambdaを使用する関数getBoundedVarsがあります。最後に、すべてのボックスbBoxには、式exp内のすべての境界付き変数が含まれている必要があります。この関数をデバッグしようとしています。そのためには、関数がアクティブになるたびにboundsInLambdaのパラメータを出力したいのですが、何らかの理由で値が画面に表示されません。表示操作をgetBoundedVarsに入れると出力されますが、それらは最初の繰り返しの値にすぎません。

次を実行すると:

(getBoundedVars (ラムダ-シンプル (x) (ラムダ-シンプル (y) (const x))) bx)

bx が空箱のとき、

'1 は出力されますが、boundsInLambda の出力コマンドは出力されません

コードは次のとおりです。

(define getBoundedVars 
(lambda (exp bBox)

    (if (atom? exp)
        0 ;; don't put in box
        (if (lambda? (car exp))
            (begin
                (display 1)
                (newline)
            (let ((pBox (make-pBox exp))
                  (lBox (box '()))
                  (bodyExp (make-body exp))
                 )

            (boundsInLambda bodyExp lBox pBox bBox)))
            (begin
                (getBoundedVars (car exp) bBox)
                (getBoundedVars (cdr exp) bBox))))))


(define boundsInLambda
    (lambda (bodyExp lastBox paramBox boundsBox)
        (newline)
        (display `(bodyExp: ,bodyExp))
        (newline)
        (display `(lastBox: ,lastBox))
        (newline)
        (display `(paramBox: ,paramBox))
        (newline)
        (display `(boundsBox: ,boundsBox))
        (newline)


        (if (and (not (null? bodyExp))
                 (list bodyExp)
                 (equal? (car bodyExp) 'seq)
            )
            (map boundsInLambda (cadr bodyExp))


            (let* ( (lists* (filter (lambda (el) (and (not (null? el)) (list? el) (not (equal? (car el) 'const)))) bodyExp))
                    (lists (map (lambda (el) (if (equal? (car el) 'set) (cddr el) el)) lists*))
                    (bounds (filter (lambda (el) (and (member el (unbox lastBox)) (not (member el (unbox paramBox))))) bodyExp))
                    (listsLeft? (> (length lists) 0)) 
                    (anyBounds? (> (length bounds) 0))
                  )

            (if anyBounds?
                (begin
                    (set-box! boundsBox (append (unbox boundsBox) bounds))))

            (if listsLeft?
                        (map 
                            (lambda (lst)

                                (if (lambda? (car lst))

                                    (let* ((newBodyExp (make-body lst))
                                        (newParamBox (make-pBox exp))
                                        (newLastBox (box (append (unbox lastBox) (unbox paramBox))))
                                        )

                                        (boundsInLambda newBodyExp newLastBox newParamBox boundsBox))

                                        (boundsInLambda lst lastBox paramBox boundsBox))) 
                        lists)
                        0))
                    )))



  (define make-pBox
        (lambda (lamExp)
            (if (equal? (car lamExp) 'lambda-simple)
                (box (cadr lamExp))
                (if (equal? (car lamExp) 'lambda-opt)
                    (box (cadr lamExp))
                    (box '())))))

(define make-body
    (lambda (lamExp)
        (if (equal? (car lamExp) 'lambda-opt)
            (cdddr lamExp)
            (cddr lamExp))))

どんな助けでも大歓迎です。

4

0 に答える 0