【发布时间】:2011-07-21 08:02:14
【问题描述】:
好的,这是一个相当基本的问题:我正在关注 SICP 视频,我对 define、let 和 set! 之间的区别有点困惑。
1) 根据视频中的 Sussman 的说法,define 只允许将值附加到变量一次(在 REPL 中除外),特别是不允许两个行内定义。然而,Guile 愉快地运行了这段代码
(define a 1)
(define a 2)
(write a)
并按预期输出 2。事情有点复杂,因为如果我尝试这样做(编辑:在上述定义之后)
(define a (1+ a))
我得到一个错误,而
(set! a (1+ a))
是允许的。我仍然不认为这是set! 和define 之间的唯一区别:我错过了什么?
2) define 和 let 之间的区别让我更加困惑。我知道理论上let 用于在本地范围内绑定变量。不过,在我看来,这与define 相同,例如我可以替换
(define (f x)
(let ((a 1))
(+ a x)))
与
(define (g x)
(define a 1)
(+ a x))
和f 和g 工作相同:特别是变量a 在g 之外也未绑定。
我认为这很有用的唯一方法是let 的范围可能比整个函数定义的范围更短。在我看来,人们总是可以添加一个匿名函数来创建必要的范围,并立即调用它,就像在 javascript 中所做的那样。那么,let 的真正优势是什么?
【问题讨论】:
-
你应该在
f的定义中正确缩进(+ a x),因为它在let的范围内。 -
你说得对,谢谢
-
看你使用的scheme系统。
-
直接来自大师(杰拉尔德·苏斯曼):youtu.be/dO1aqPBJCPg?t=1080
-
@pakman 该视频说,define 是 let 的语法糖。所以,它仍然没有说明为什么我们需要定义和让,或者在什么情况下你会使用一个而不是另一个。
标签: scheme