为什么要使用';和lambda?

为什么要使用';和lambda?,lambda,lisp,quote,Lambda,Lisp,Quote,为什么我要将#与lambda一起使用?它通常是这样写的,所以我想这是一种很好的形式。但在我看来,这两条线是相等的: > (mapcar #'(lambda (x) (+ x 1)) '(1 2 3)) (2 3 4) > (mapcar (lambda (x) (+ x 1)) '(1 2 3)) (2 3 4) 有人想让初学者了解这一区别吗?#“是函数的缩写,它返回指向函数的指针(而不是应用它)lambda返回一个函数,通常需要指向该函数的指针。由于这种情况非常常见,因此还有一个

为什么我要将#与lambda一起使用?它通常是这样写的,所以我想这是一种很好的形式。但在我看来,这两条线是相等的:

> (mapcar #'(lambda (x) (+ x 1)) '(1 2 3))
(2 3 4)
> (mapcar (lambda (x) (+ x 1)) '(1 2 3))
(2 3 4)
有人想让初学者了解这一区别吗?

#“
函数的缩写,它返回指向函数的指针(而不是应用它)
lambda
返回一个函数,通常需要指向该函数的指针。由于这种情况非常常见,因此还有一个宏(在变量空间中)可以为您执行此操作,它也被称为
lambda
。两行代码都是相同的


哪一个更好可以归结为:在CommonLisp中,由于宏的作用,您可以任意选择。一如既往,要保持一致。

这在不同的Lisp方言中是不同的。以下使用公共Lisp:

(#'(lambda (x) (* x 2)) 17)   ; illegal in Common Lisp

(function #'(lambda (x) (* x 2)))  ; illegal in Common Lisp
第一个#是(函数…)的简短符号。因此,以下内容仅在文本上有所不同,但Common Lisp对它们的理解是相同的:

#'(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)(*x2))

根据上下文的不同,这是两件不同的事情

Lambda表达式

可以使用lambda表达式代替函数名:

(function foo)   and    (function (lambda (x) (* x 2)))

以上两种是法律上常见的Lisp语法。可以直接使用lambda表达式

请注意,以下两种形式在Common Lisp中是非法的:

(#'(lambda (x) (* x 2)) 17)   ; illegal in Common Lisp

(function #'(lambda (x) (* x 2)))  ; illegal in Common Lisp

在通用Lisp标准化过程中,添加了宏LAMBDA(它不是通用Lisp的第一个描述CLtL1的一部分)。它使编写稍微短一点的代码成为可能。例如:

(lambda (x) (* x 2))
在上述情况下,LAMBDA是一个宏。在宏扩展期间,它将扩展为:

(function (lambda (x) (* x 2)))
请记住,在上述函数形式中,内部lambda是lambda表达式的一部分,表示函数,不会展开

现在,上面的三个例子可以写成:

(map (lambda (x) (* x 2)) '(1 2 3))

(defun (y) (lambda (x) (* x y)))

(defparameter *twice-fn* (lambda (x) (* x 2)))
它稍微短一点,看起来不那么凌乱,看起来更像Scheme代码。对于习惯于读写Scheme代码的程序员来说,这只是看起来好一点而已

摘要

a) (function(lambda(x)(*x2))是编写将函数作为值返回的代码的“true”方式

b) #’(lambda(x)(*x2))是上面的较短符号

c) (lambda(x)(*x2))甚至更短,但使用宏展开来创建a的形式)

(map (lambda (x) (* x 2)) '(1 2 3))

(defun (y) (lambda (x) (* x y)))

(defparameter *twice-fn* (lambda (x) (* x 2)))