Scheme中的标识符和绑定 - 如何解释函数?

时间:2010-10-25 03:16:09

标签: scheme racket

我正在阅读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的函数,它附加两个字符串。

我根本不懂这个功能。 谢谢!

2 个答案:

答案 0 :(得分:5)

您所指的部分展示了Racket中的词法范围。与其他Scheme实现一样,重点是您可以“隐藏”语言中的每个绑定。与大多数“主流”语言不同,没有真正的关键词是“神圣的”,因为它们永远不会被本地绑定所遮蔽。

请注意,一个非常好的工具可视化绑定的位置是DrRacket的“检查语法”按钮:单击它,您将看到带有突出显示的代码,显示哪些部分是绑定,哪些是特殊形式 - 以及是否将鼠标悬停在特定名称上,您会看到一个箭头,告诉您它来自何处。

答案 1 :(得分:4)

Scheme需要一些时间来适应:)

  1. f被分配了lambda返回的函数。
  2. lambda定义了一个带参数的函数(称为append)。
  3. (define cons (append "ugly" "confusing"))本身不是一个函数,但调用附加两个字符串作为参数,并将结果分配给cons。
  4. let块内,重新分配了附加值,即符号this-was
  5. let块创建一个append列表(现在包含'this-was)和cons(其中包含'("ugly" "confusing")来自上面的
  6. 因为5是整个函数返回的最后一个语句,称为f
  7. 使用参数flist函数)调用
  8. list。它作为参数追加传递。这就是为什么上述3创建了一个列表'("ugly" "confusing"),并将其分配给cons
  9. 希望稍微清理一下。 干杯!