Eme*_*sJr 6 scheme let racket letrec
所以,据我了解,以下内容:let,let*,letrec并letrec*在方案/球拍使用人工合成的糖.
现在,如果我有一个简单的程序:
(let ((x 1)
(y 2))
(+ x y))
Run Code Online (Sandbox Code Playgroud)
它被翻译成:
((lambda (x y) (+ x y)) 1 2)
Run Code Online (Sandbox Code Playgroud)
如果我有:
(let* ((x 1)
(y 2))
(+ x y))
Run Code Online (Sandbox Code Playgroud)
它被翻译成:
((lambda (x) ((lambda (y) (+ x y))) 2) 1)
Run Code Online (Sandbox Code Playgroud)
现在,对于我的第一个问题,我理解一个letrec表达式的含义,它允许一个人在let中使用递归,但我不明白它是如何完成的.什么是letrec翻译成?
例如,会是什么
(letrec ((x 1)
(y 2))
(+ x y))
Run Code Online (Sandbox Code Playgroud)
被翻译成?
第二个问题是类似的letrec*- 但letrec*我不明白它究竟有何不同letrec?而且,letrec*表达式将被翻译成什么?
请参阅 Oscar Waddell、Dipanwita Sarkar 和 R. Kent Dybvig 撰写的论文“Fixing Letrec:A Faithful Yet Efficient Implementation of Scheme's Recursive Binding Construct”。
这篇论文从一个简单的版本开始,然后继续解释一个更复杂的扩展:
https://www.cs.indiana.edu/~dyb/pubs/fixing-letrec.pdf