gpt4 book ai didi

common-lisp - 用Lisp编写Lambda表达式

转载 作者:行者123 更新时间:2023-12-03 14:49:11 25 4
gpt4 key购买 nike

我目前正在阅读Paul Graham撰写的ANSI Common Lisp,并且对编写Lambda表达式有疑问。

我们是否需要为lambda表达式加上#'前缀?如果我在REPL中写这样的东西,它将正常工作

> ((lambda (x) (+ x 1)) 1)
2


所以会这样

> (mapcar (lambda (x) (+ x x)) '(1 2 3 4))
(2 4 6 8)


我知道 #'表示一个函数。所以我的问题是,这是某种惯例还是推荐做法?如果我不为lambdas加上 #'前缀,会发生什么错误,它是否取决于实现?

最佳答案

LAMBDA表达式

(lambda ...)仅在某些地方(例如function形式或作为函数调用的头)才被视为lambda表达式。不评估Lambda表达式。

(function              ; special operator FUNCTION
(lambda () 'foobar)) ; <- this is a lambda expression


( ; a function call
(lambda (foo) foo) ; <- this is a lambda expression
'bar ; argument
)


但是这里 (lambda ...)是宏形式,而不是lambda表达式:

(funcall             ; calling a function via funcall
(lambda (foo) foo) ; this is not a lambda expressions, but the macro lambda
; as all arguments to FUNCALL it will be
; macro expanded and evaluated
; it expands to (function (lambda (foo) foo))
'bar) ; argument


LAMBDA宏

LAMBDA是宏。它将 (lambda ...)扩展为 (function (lambda ...)),与 #'(lambda ...))等效。

CL-USER > (macroexpand '(lambda (foo) foo))
(FUNCTION (LAMBDA (FOO) FOO))


宏为您节省了一些写/读操作,仅此而已。在Common Lisp(CLtL1)的第一个版本中,没有 LAMBDA宏。它已在以后添加,现在已成为ANSI Common Lisp的一部分,

FUNCTION特殊运算符

FUNCTION是特殊运算符。它需要一个函数名或一个lambda表达式。因此,不评估名称或lambda表达式。实际上,lambda表达式根本无法求值。在 FUNCTION中,lambda表达式不是宏形式,因此不会再次扩展。 FUNCTION的目的是返回名称或lambda表达式表示的相应功能对象。它返回函数对象作为值。使用这种特殊的运算符,可以从全局函数和词法函数访问函数对象。

FUNCTION运算符在Common Lisp中是必需的,因为它具有用于值,函数和其他一些东西的独立命名空间。它是所谓的Lisp-2甚至Lisp-n,具有两个或多个命名空间。

函数形式中函数位置中的Lambda表达式

Common Lisp的内置语法支持 ((lambda (foo) foo) 10)。请参见 Lambda Forms

令人困惑

这是合乎逻辑的,但令人困惑。不必担心您并不孤单,但实际上这并不重要。

关于common-lisp - 用Lisp编写Lambda表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13213611/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com