Lisp 尖引号(')与符号函数有何不同?

Lisp 尖引号(')与符号函数有何不同?,lisp,elisp,common-lisp,sharp-quote,Lisp,Elisp,Common Lisp,Sharp Quote,在我看来,这些操作员似乎也在做同样的事情。两者都接受一个符号并返回与其关联的函数。有什么区别吗 elisp评估返回以下内容: 德芬福x+1 x 福 富3 4. “福 我也不明白 此外,common lisp和elisp之间是否存在差异?我正在从这两个方面的资源中学习 公共Lisp: 符号函数无法从词汇绑定函数中检索函数。默认情况下,函数引用词汇绑定函数。'foo只是函数foo的一个较短的符号 公共Lisp: 符号函数无法从词汇绑定函数中检索函数。默认情况下,函数引用词汇绑定函数。'foo只是函数

在我看来,这些操作员似乎也在做同样的事情。两者都接受一个符号并返回与其关联的函数。有什么区别吗

elisp评估返回以下内容:

德芬福x+1 x 福 富3 4. “福

我也不明白

此外,common lisp和elisp之间是否存在差异?我正在从这两个方面的资源中学习

公共Lisp:

符号函数无法从词汇绑定函数中检索函数。默认情况下,函数引用词汇绑定函数。'foo只是函数foo的一个较短的符号

公共Lisp:

符号函数无法从词汇绑定函数中检索函数。默认情况下,函数引用词汇绑定函数。'foo只是函数foo的一个较短的符号

讨论了可以使用函数执行的操作,而不能使用符号函数执行的操作,即检索词汇范围函数的值,但也存在一些其他差异

特殊算子函数 提供了一种在词汇环境中查找名称的功能值的方法。它的参数是函数名或lambda表达式。该函数可以采用lambda表达式,这意味着您可以编写:function lambda x list x。术语“函数名”不仅仅包括符号。它还包括表单setf name的列表,这意味着您可以执行函数setf car之类的操作

存取器符号函数 另一方面,访问器允许您检索和设置符号的功能值。因为它需要一个符号,所以不能使用符号函数lambda…或函数setf name。符号函数也看不到词汇环境;它仅适用于全局定义。例如:

(flet ((foo () 'result))
  (symbol-function 'foo))
;=> NIL
由于symbol函数是一个访问器,因此可以使用它更改函数符号的值。例如:

CL-USER> (setf (symbol-function 'foo) (lambda () 42))
#<FUNCTION (LAMBDA ()) {1005D29AAB}>
CL-USER> (foo)
42
CL-USER> (setf (symbol-function 'foo) (lambda () 26))
#<FUNCTION (LAMBDA ()) {1005D75B9B}>
CL-USER> (foo)
26
访问器定义 还有一个类似于symbol的函数,它只能访问全局定义的函数,但它可以访问符号和setf名称列表。但是,它不会检索lambda函数的值。

讨论了可以使用函数执行的操作,而不能使用符号函数执行的操作,即检索词汇范围函数的值,但也存在一些其他差异

特殊算子函数 提供了一种在词汇环境中查找名称的功能值的方法。它的参数是函数名或lambda表达式。该函数可以采用lambda表达式,这意味着您可以编写:function lambda x list x。术语“函数名”不仅仅包括符号。它还包括表单setf name的列表,这意味着您可以执行函数setf car之类的操作

存取器符号函数 另一方面,访问器允许您检索和设置符号的功能值。因为它需要一个符号,所以不能使用符号函数lambda…或函数setf name。符号函数也看不到词汇环境;它仅适用于全局定义。例如:

(flet ((foo () 'result))
  (symbol-function 'foo))
;=> NIL
由于symbol函数是一个访问器,因此可以使用它更改函数符号的值。例如:

CL-USER> (setf (symbol-function 'foo) (lambda () 42))
#<FUNCTION (LAMBDA ()) {1005D29AAB}>
CL-USER> (foo)
42
CL-USER> (setf (symbol-function 'foo) (lambda () 26))
#<FUNCTION (LAMBDA ()) {1005D75B9B}>
CL-USER> (foo)
26
访问器定义
还有一个类似于symbol的函数,它只能访问全局定义的函数,但它可以访问符号和setf名称列表。但是,它无法检索lambda函数的值。

您可能希望删除此问题中的elisp标记-我认为您在提问之前没有在Emacs中尝试过此操作。@phils我也不了解elisp的行为,请参见编辑。在elisp中,函数“在很大程度上等同于引号”,因此它不会返回符号的函数定义;它只返回符号。从历史上看,仍然有理由使用它——好处仅限于字节编译,现在也有理由与词汇绑定相关,但您的特定问题标题对elisp来说意义不大。我进一步建议您至少学习一个Lisp的基础知识,也许是在短期内给你最大回报的,然后再学习另一个。在早期学习两个口齿不清的单词并不断比较它们只会让你很困惑。事实上,这非常适合任何两种类似的语言。您可能希望从这个问题中删除elisp标记-我认为您在提问之前没有在Emacs中尝试过这一点。@phils我也不理解elisp的行为,请参见编辑。在elisp中,函数“在很大程度上等同于引号”,因此它不会返回符号的函数定义;它只返回符号。从历史上看,仍然有理由使用它——好处仅限于字节编译,现在也有与词汇绑定相关的原因,但您的特定问题标题对elisp来说意义不大
进一步建议您学习一个Lisp,至少是基础知识,也许是短期内给您带来最大回报的一个,然后再学习另一个。在早期学习两个口齿不清的单词并不断比较它们只会让你很困惑。实际上,这很适合任何两种类似的语言。符号和名称之间有区别吗?我开始怀疑我对词法范围的理解是否比我想象的要少。@djechlin符号是一个实际的对象。您可以检查它,您可以使用make符号等创建它们。在源代码中,符号作为数据经常出现。然而,词法变量,例如let x 42 x中的x,虽然在源代码中由符号表示,但在运行时实际上与符号没有任何联系。let x 42 x的编译版本不需要知道任何关于符号x的信息。直觉上,这是有道理的,因为我们希望代码让y42y编译成相同的东西。然而,当一个变量是特殊的时,有a@djechlin与符号的连接。至于变量名和符号之间的区别:大多数时候,当你需要一个函数名时,你会对一些符号感兴趣,例如car或makeperson。但表单setf的列表也是函数名。例如,你可以做funcall的setf car。。。。看,符号和名字之间有区别吗?我开始怀疑我对词法范围的理解是否比我想象的要少。@djechlin符号是一个实际的对象。您可以检查它,您可以使用make符号等创建它们。在源代码中,符号作为数据经常出现。然而,词法变量,例如let x 42 x中的x,虽然在源代码中由符号表示,但在运行时实际上与符号没有任何联系。let x 42 x的编译版本不需要知道任何关于符号x的信息。直觉上,这是有道理的,因为我们希望代码让y42y编译成相同的东西。然而,当一个变量是特殊的时,有a@djechlin与符号的连接。至于变量名和符号之间的区别:大多数时候,当你需要一个函数名时,你会对一些符号感兴趣,例如car或makeperson。但表单setf的列表也是函数名。例如,你可以做funcall的setf car。。。。看见