[英]Small question about scheme
我对lisp很新,最近我发现了我不懂的薄片。
此代码有效:
(define (f x) (define a x) (define (b) a) (b))
而这不是:
(define (f x) (define a x) (define b a) b)
为什么?
在kawa interpeter它工作在Guile它没有,因为这个代码
(define (f x) (define a x) (define b a) b)
扩大到
(define (f x) (letrec ((a x) (b a)) b))
你不能访问到a
我之前的分配。 letrec
不适用于非函数定义,例如:
(letrec ((x 5)
(y x))
y)
你可以使用let*
insted
(define (f x) (let* ((a x) (b a)) b))
在这段代码中
(define (f x) (define a x) (define (b) a) (b))
在过程b中,您可以在已定义变量时访问变量。
你应该查看关于letrec*
讨论 - 一些实现使用它作为更严格的letrec
的更宽松版本,这导致你看到的差异。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.