gpt4 book ai didi

binding - emacs lisp 中的 let 和 flet

转载 作者:行者123 更新时间:2023-12-03 07:38:45 28 4
gpt4 key购买 nike

我不知道你是否会称其为规范公式,但为了绑定(bind)本地函数,GNU 手册建议我使用“flet”:

(defun adder-with-flet (x)
(flet ( (f (x) (+ x 3)) )
(f x))
)

但是,我偶然尝试了(在玩了一会儿Scheme之后)下面的表达式,其中我使用“let”将lambda表达式绑定(bind)到变量,并且如果我将函数传递给mapcar*,它也可以工作:

(defun adder-with-let (x)
(let ( (f (lambda (x) (+ x 3))) )
(car (mapcar* f (list x)) ))
)

这两个功能都有效:

(adder-with-flet 3)   ==> 6
(adder-with-let 3) ==> 6

为什么第二个有效?我找不到任何可以使用“let”将函数绑定(bind)到符号的文档。

最佳答案

与Scheme不同,Emacs Lisp是一个2-lisp,这意味着每个符号都有两个单独的绑定(bind):值绑定(bind)和函数绑定(bind)。在函数调用 (a b c d) 中,使用函数绑定(bind)查找第一个符号 (a),其余符号 (b c d) 则查找使用值绑定(bind)。特殊形式 let 创建一个新的(本地)值绑定(bind),flet 创建一个新的函数绑定(bind)。

请注意,是否使用值绑定(bind)或函数绑定(bind)进行查找取决于 (a b c d) 函数调用中的位置,而不是类型> 所查找的值。特别是,值绑定(bind)可以解析为函数。

在第一个示例中,您对 f 进行函数绑定(bind)(通过 flet),然后进行函数查找:

(f ...)

在第二个示例中,您将 f 值绑定(bind)到函数(通过 let),然后使用值查找:

(... f ...)

两者都有效,因为您在每种情况下都使用相同类型的绑定(bind)和查找。

http://en.wikipedia.org/wiki/Common_Lisp#Comparison_with_other_Lisps

关于binding - emacs lisp 中的 let 和 flet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1197184/

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