let、let* 和 letrec 有什么区别?
请给出详尽的解释和例子。
最好的办法是阅读、和的官方 R5RS 描述。let
let*
letrec
然而,简而言之:
(let ((x 2))
(let ((x 3) (y x))
y) => 2
(let ((x 2))
(let* ((x 3) (y x))
y) => 3
let
因此,和let*
is之间的区别let
将评估与上述级别相关的所有绑定(因此它们列出的顺序无关紧要),同时let*
按顺序进行。(let* ((x a) (b y)))
相当于(let ((x a)) (let ((b y)))
。
letrec
,另一方面,允许您绑定递归值。因此,您可能会编写一个只希望在函数范围内的递归函数,并将其绑定到使用letrec
.