显示 β-reductor 中的中间项

Displaying intermediate terms in a β-reductor

考虑以下 β-减速器:

(define (normalize v)
  (set! count 0)
  (set! reflected '())
  (reify v))

(define (reify v)
  (if (memq v reflected)
      (v cancel)
      (let ((x (gensym)))
    (ABS x (reify (v (reflect x)))))))

(define (reflect e)
  (let ((f (lambda (v)
         (if (eq? v cancel)
         e
         (reflect (APP e (reify v)))))))
    (set! reflected (cons f reflected))
    f))

(define (APP e1 e2) `(,e1 ,e2))

(define (ABS x e) `(lambda (,x) ,e))

(define reflected '())

(define count 0)

(define cancel '(cancel))

(define (gensym)
  (set! count (+ 1 count))
  (string->symbol (string-append "x" (number->string count))))

我想分析一下它的β-reduction order。但是,由于我对 Scheme 不太了解,所以我希望看到它作为纯 lambda 表达式计算的中间项(现在它只打印最终结果)。我知道如何显示一条线,但我无法在正确的位置挤压 (display term) (newline)

下面是两个简单的术语,可用于验证解决方案 - Church one (λfx.f x) 和 succ (λnfx.f (n f x))(我希望我写了它们在方案中正确):

(define One
  (lambda (f) (lambda (x) (f x))))

(define succ
  (lambda (n) (lambda (f) (lambda (x) (f ((n f) x))))))

(normalize (succ One))

是否可以显示这个reductor计算的中间项?

不,这是一个大步长的NBE算法(意思是"all at once")。它的工作原理是将您的术语语言反映到宿主语言中,以搭载在宿主执行引擎上。