对我来说,这些运营商似乎做同样的事情。 无论采取一个符号,并返回与之相关的功能。 有什么区别吗?
elisp
评价返回以下内容:
(defun定义FOO(X)(+ 1×))
FOO
(FOO 3)
4
#'富
这一点我也不能理解。
此外有共同Lisp和elisp的有区别吗? 我从任一资源学习。
对我来说,这些运营商似乎做同样的事情。 无论采取一个符号,并返回与之相关的功能。 有什么区别吗?
elisp
评价返回以下内容:
(defun定义FOO(X)(+ 1×))
FOO
(FOO 3)
4
#'富
这一点我也不能理解。
此外有共同Lisp和elisp的有区别吗? 我从任一资源学习。
Common Lisp的 :
SYMBOL-FUNCTION
无法检索从词法约束函数的函数。 FUNCTION
默认情况下,引用了词法约束功能。 #'foo
仅仅是一个更短的符号(FUNCTION foo)
CL-USER 1 > (defun foo () 'foo)
FOO
CL-USER 2 > (flet ((foo () 'bar))
(list (funcall (symbol-function 'foo))
(funcall #'foo)
(funcall (function foo))
(eq (function foo) (symbol-function 'foo))))
(FOO BAR BAR NIL)
CL-USER 3 > (eq (function foo) (symbol-function 'foo))
T
雷纳的回答讨论,您可以使用的功能 ,可以不与符号功能做的,即检索的词法范围的功能价值做的事情,但也有一些其他的差异太大。
在特殊操作功能提供了一种方法找到一个名字的词汇环境功能价值。 它的参数可以是一个函数名或λ表达式。 这个功能可以采取lambda表达式意味着你可以这样写:(函数(拉姆达(X)(表XX)))。 术语函数名不仅仅包括多个符号。 它也包括形式(SETF 名称 ),这意味着你可以做这样的事情的清单(功能(SETF车))。
存取符号功能 ,而另一方面,可以让您检索和设置一个符号的功能价值。 因为它需要一个符号,你不能这样做(符号功能(拉姆达...))或(函数(SETF 名 ))。 符号功能也无法看到词法环境; 它仅适用于全球的定义。 例如,
(flet ((foo () 'result))
(symbol-function 'foo))
;=> NIL
由于符号的功能是访问 ,你可以改变一个函数与它象征的价值。 例如:
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
另外还有访问fdefinition这是一种像符号功能是只能访问全局定义的功能,但有点像功能 ,它可以访问的符号和(SETF 名 )名单。 但是,它不检索的lambda函数的值。