为什么这两个问题的结果是一样的


    ((lambda (proc) (
  1. proc "yes" "no")) (lambda (a b) a)) ;; yes

  2. (lambda (a b) a) "yes" "no") ;; yes

我的问题是为什么 1 和 2 的结果相同,它们是否相同?有人可以把它说清楚一点吗?

它们给出相同的结果,但它们并不"相同"。它们是两种碰巧给出相同结果的语言结构(嗯,是的,在函数世界中,它们是等价的,但我认为你不是指这一点。

实际上,理解结构会降低对语言本身的理解(Scheme)。我可以给你一些提示。

粗略地说,构造(X Y)的意思是"功能应用"。也就是说,第一个X是一个函数,Y是一个参数或一组参数。然后使用 Y 参数调用函数 X

以你的第二行为例,你可以看到,分解它,它有:

(<Function> "yes" "no")

也就是说,可能是一个函数的东西,然后是两个参数。在 Scheme 中,您可以构建匿名函数,这些函数没有名称,但您可以指定它们期望作为参数的内容以及调用时它们的作用。这称为"lambda 函数"。在您的情况下,lambda 函数定义为:

(lambda (a b) a)

也就是说,一个没有名称的函数,它接受两个参数ab并返回第一个参数。如果你把所有的东西放在一起,你会得到

((lambda (a b) a) "yes" "no")

显然,它是一个函数应用程序,它返回传递的第一个参数,因为 Lambda 函数就是这样做的。

第一种情况类似,但在这种情况下,函数本身作为参数传递。你有:

(<Function> (lambda (a b) a))

其中,此Function接受可用于构建应用程序表达式并生成结果的"某些东西":

(lambda (proc) (proc "yes" "no"))

也就是说,接受一些函数proc,并用两个参数"调用"它。请注意,您传递的函数 (lambda (a b) a) 接受两个参数并返回第一个参数,因此它会再次生成"yes"

最新更新