繁体   English   中英

关于计划的小问题

[英]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的更宽松版本,这导致你看到的差异。

您可能会看到R5RS和R6RS标准之间的行为变化。 R6RS的一个变化是“内部定义现在用letrec*定义。”

在R5RS中,内部define s 完全等同letrec 特别是,关于内部定义的部分说“就像等效的letrec表达式一样,必须可以评估<body>中每个内部定义的每个<expression> <body>而不分配或引用任何<variable>的值。被定义。“

但是,在R6RS中,内部define s 等同letrec* 并且,正如您所期望的那样, letrec* 允许您在初始化器中引用先前变量的值以用于以后的变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM