我正在阅读DrRacket文件http://docs.racket-lang.org/guide/binding.html
有一个功能
(define f
(lambda (append)
(define cons (append "ugly" "confusing"))
(let ([append 'this-was])
(list append cons))))
> (f list)
'(this-was ("ugly" "confusing"))
我看到我们定义了函数f,我们在内部定义了带(append)的lambda,为什么? lambda的过程(主体)是另一个名为cons的函数,它附加两个字符串。
我根本不懂这个功能。 谢谢!
答案 0 :(得分:5)
您所指的部分展示了Racket中的词法范围。与其他Scheme实现一样,重点是您可以“隐藏”语言中的每个绑定。与大多数“主流”语言不同,没有真正的关键词是“神圣的”,因为它们永远不会被本地绑定所遮蔽。
请注意,一个非常好的工具可视化绑定的位置是DrRacket的“检查语法”按钮:单击它,您将看到带有突出显示的代码,显示哪些部分是绑定,哪些是特殊形式 - 以及是否将鼠标悬停在特定名称上,您会看到一个箭头,告诉您它来自何处。
答案 1 :(得分:4)
Scheme需要一些时间来适应:)
f
被分配了lambda
返回的函数。lambda
定义了一个带参数的函数(称为append
)。(define cons (append "ugly" "confusing"))
本身不是一个函数,但调用附加两个字符串作为参数,并将结果分配给cons。let
块内,重新分配了附加值,即符号this-was
。append
列表(现在包含'this-was
)和cons
(其中包含'("ugly" "confusing")
来自上面的f
f
(list
函数)调用list
。它作为参数追加传递。这就是为什么上述3创建了一个列表'("ugly" "confusing")
,并将其分配给cons
。希望稍微清理一下。 干杯!