我正在为 GIMP 编写脚本并使用let*
就像我采集的样本一样。但它似乎只是一种 lambda 糖,就像let
。为什么它们不同?它们之间有什么区别?
它们在变量绑定的顺序上有所不同。例如考虑这个:
> (let ((a 1)(b (+ a 2))) b)
此代码将失败,因为b
需要a
,之前没有定义过。它被定义为,在同一个let
,但是Scheme会带走你所有的let
定义仅作为一种陈述,不允许它们相互引用。在 Gambit 方案中,它提出:
*** ERROR IN ##raise-unbound-global-exception -- Unbound variable: a
反过来,let*
将绑定的第一个变量let
,然后是第二个,依此类推...所以:
> (let* ((a 1)(b (+ a 2))) b)
3
按预期工作。
有趣的第三种形式是letrec
这不仅让变量let
引用其他变量,但也让它们引用自己(例如用于递归)。这使您可以编写如下代码:
> (letrec ((f (lambda(n) ;; Takes the binary log2 recursively
(cond
((= n 1) 0)
(else (+ 1 (f (/ n 2))))))))
(f 256)) ;; 2^8 = 256
8
如果您尝试使用以下方式定义递归函数let
or let*
,它会告诉你该变量未绑定。
所有这些都可以通过巧妙地重新排列/嵌套 let 语句来实现,但是let*
and letrec
在某些情况下可以更加方便和可读。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)