为什么要我用#”拉姆达与一起?它通常被写成这样,所以我想这是很好的形式。但是,这些线条看起来等于我:

> (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))更短,但使用宏扩展来创建的表格)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top