- ((lambda (proc) (
proc "yes" "no")) (lambda (a b) a)) ;; yes
((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)
也就是说,一个没有名称的函数,它接受两个参数a
和b
并返回第一个参数。如果你把所有的东西放在一起,你会得到
((lambda (a b) a) "yes" "no")
显然,它是一个函数应用程序,它返回传递的第一个参数,因为 Lambda 函数就是这样做的。
第一种情况类似,但在这种情况下,函数本身作为参数传递。你有:
(<Function> (lambda (a b) a))
其中,此Function
接受可用于构建应用程序表达式并生成结果的"某些东西":
(lambda (proc) (proc "yes" "no"))
也就是说,接受一些函数proc
,并用两个参数"调用"它。请注意,您传递的函数 (lambda (a b) a)
接受两个参数并返回第一个参数,因此它会再次生成"yes"
。