尖锐的引用(#')与符号函数有何不同?

时间:2015-03-28 17:59:23

标签: lisp elisp common-lisp sharp-quote

对我来说,这些运营商似乎做了同样的事情。两者都采用符号并返回与之关联的函数。有什么区别吗?

elisp评估会返回以下内容:

  

(defun foo(x)(+ 1 x))
  FOO
   (foo 3)
  4
  #'富

我也不明白。

此外,普通的lisp和elisp有区别吗?我正在从中学习资源。

2 个答案:

答案 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讨论您可以使用功能执行的操作,您可以使用符号功能,即检索词法的值范围函数,但也有一些其他差异。

特殊运算符FUNCTION

special operator FUNCTION提供了一种在词汇环境中查找名称功能值的方法。它的参数是函数名或lambda表达式。 函数可以使用lambda表达式意味着您可以编写:(函数(lambda(x)(列表x x)))。术语功能名称不仅包括符号。它还包含(setf name 形式的列表,这意味着您可以执行(function(setf car))等操作。< / p>

存取符SYMBOL-FUNCTION

另一方面,访问者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

存取器FDEFINITION

还有accessor fdefinition有点像符号函数,因为它只能访问全局定义的函数,但有点像函数因为它可以访问符号和(setf 名称列表。但是,它不检索lambda函数的值。