题
为什么要我用#”拉姆达与一起?它通常被写成这样,所以我想这是很好的形式。但是,这些线条看起来等于我:
> (mapcar #'(lambda (x) (+ x 1)) '(1 2 3))
(2 3 4)
> (mapcar (lambda (x) (+ x 1)) '(1 2 3))
(2 3 4)
任何护理开导一个关于差初学者?
解决方案
#'
是简写function
,它返回一个指针(而不是施加的话)的功能。 lambda
返回一个函数,这是通常想要一个指向功能。由于这是如此普遍,也有认为它会为你的宏(可变空间),这被称为lambda
为好。的代码两行是相同的。
哪个更好归结为 Lisp的1 / Lisp的2辩论: Common Lisp中,你可以做要么,感谢宏。与往常一样,是一致的。
其他提示
它是在各种Lisp的方言不同。下面使用的Common Lisp:
第一<强>#”为(功能...)一个短符号即可。所以下面只以文本方式不同,但Common Lisp的读取它们为相同的:
#'(lambda (x) (* x 2))
和
(function (lambda (x) (* x 2)))
#”是一个readmacro,并且当Lisp代码由Lisp的系统读取变换。
如果Lisp的评估
(function (lambda (x) (* x 2)))
的 Lisp的系统创建一个功能对象和函数返回它作为其值强>
所以,当你需要一个函数的值,那么你需要把它写这样的。需要一个值的函数,当你想将它传递给另一个函数作为参数,当你想从一个函数返回,或当你想将其存储在一个变量。例子:
(map #'(lambda (x) (* x 2)) '(1 2 3))
(defun (y) #'(lambda (x) (* x y)))
(defparameter *twice-fn* #'(lambda (x) (* x 2)))
现在,什么是(拉姆达(X)(*×2))?
有根据上下文两个不同的东西。
<强> Lambda表达式强>
在lambda表达式可以用来代替函数名的:
(function foo) and (function (lambda (x) (* x 2)))
和
(foo 17) and ((lambda (x) (* x 2)) 17)
以上两种都是合法的Common Lisp的语法。有lambda表达式,可直接使用。
请注意以下两种形式都是非法强> Common Lisp中:
(#'(lambda (x) (* x 2)) 17) ; illegal in Common Lisp
(function #'(lambda (x) (* x 2))) ; illegal in Common Lisp
<强>宏强>
在Common Lisp的标准化处理的宏LAMBDA已被添加(这是不是第一次描述,CLtL1,Common Lisp中的一部分)。这使得它可以编写略短代码。例如:
(lambda (x) (* x 2))
在上面的情况下LAMBDA是一个宏。在宏扩展它将被扩展为:
(function (lambda (x) (* x 2)))
请记住,在上述功能的形式,所述内的λ是λ表达式的一部分,表示功能,不会被扩大。
所以,现在从上面的三个例子可以写为:
(map (lambda (x) (* x 2)) '(1 2 3))
(defun (y) (lambda (x) (* x y)))
(defparameter *twice-fn* (lambda (x) (* x 2)))
有稍短,看起来有点混乱少,看起来稍微更类似于方案的代码。它只是寻找用来读取和写入方案代码的程序员会好一点。
<强>摘要强>
A)(函数(拉姆达(X)(*×2)))为 '真' 的方式来写一个返回函数作为值代码。
B)#'(拉姆达(X)(*×2))是上述
更短的符号C)(拉姆达(X)(*×2))更短,但使用宏扩展来创建的表格)。