0

我有使用函数boundsInLambda的函数getBoundedVars。最后,所有框bBox都应包含表达式exp中的所有有界变量。我正在尝试调试此函数,为此我想在每次激活该函数时打印boundsInLambda的参数,但由于某种原因,这些值不会显示在屏幕上。如果我将显示操作放在getBoundedVars中,它将打印它,但这些只是第一次迭代中的值。

如果我运行以下命令:

(getBoundedVars (lambda-simple (x) (lambda-simple (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