【发布时间】:2018-11-10 16:13:37
【问题描述】:
据我了解,以下内容:let、let*、letrec 和 letrec* 是 Scheme/Racket 中使用的合成糖。
现在,如果我有一个简单的程序:
(let ((x 1)
(y 2))
(+ x y))
翻译成:
((lambda (x y) (+ x y)) 1 2)
如果我有:
(let* ((x 1)
(y 2))
(+ x y))
翻译成:
((lambda (x) ((lambda (y) (+ x y))) 2) 1)
现在,对于我的第一个问题,我了解letrec 表达式的含义,它使人们能够在 let 中使用递归,但我不明白它是如何完成的。 letrec 翻译成什么?
例如,会发生什么
(letrec ((x 1)
(y 2))
(+ x y))
被翻译成?
第二个问题与letrec* 类似——但对于letrec*,我不明白它与letrec 有何不同?还有,letrec* 表达式会被翻译成什么?
【问题讨论】:
-
letrec没有被翻译成任何东西。letrec是该语言的原始形式。 (而且,就其价值而言,在 Racket 中,let也是是 Racket 中的原始形式,而不是lambda之上的宏,但这更多是一种主观的设计选择。) -
翻译与否是一回事。但是
letrec不能有一个等价的表达式,就像let和let*有一个等价的表达式一样(比如我在我的例子中指定的)?