对我来说,这些运营商似乎做了同样的事情。两者都采用符号并返回与之关联的函数。有什么区别吗?
elisp
评估会返回以下内容:
(defun foo(x)(+ 1 x))
FOO
(foo 3)
4
#'富
我也不明白。
此外,普通的lisp和elisp有区别吗?我正在从中学习资源。
答案 0 :(得分:6)
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
答案 1 :(得分:3)
Rainer's answer讨论您可以使用功能执行的操作,您可以使用符号功能,即检索词法的值范围函数,但也有一些其他差异。
special operator FUNCTION提供了一种在词汇环境中查找名称功能值的方法。它的参数是函数名或lambda表达式。 函数可以使用lambda表达式意味着您可以编写:(函数(lambda(x)(列表x x)))。术语功能名称不仅包括符号。它还包含(setf name )形式的列表,这意味着您可以执行(function(setf car))等操作。< / p>
另一方面,访问者symbol-function允许您检索和设置符号的功能值。由于它需要一个符号,你不能做(符号 - 函数(lambda ...))或(函数(setf name ))。 符号功能也无法看到词汇环境;它只适用于全局定义。例如,
(flet ((foo () 'result))
(symbol-function 'foo))
;=> NIL
由于符号功能是访问者,您可以更改功能符号的值。 E.g:
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
还有accessor fdefinition有点像符号函数,因为它只能访问全局定义的函数,但有点像函数因为它可以访问符号和(setf 名称)列表。但是,它不检索lambda函数的值。