如何是尖锐的报价(#')的符号功能有什么不同?(How is sharp quote (#&

2019-10-22 10:21发布

对我来说,这些运营商似乎做同样的事情。 无论采取一个符号,并返回与之相关的功能。 有什么区别吗?

elisp评价返回以下内容:

(defun定义FOO(X)(+ 1×))
FOO
(FOO 3)
4
#'富

这一点我也不能理解。

此外有共同Lisp和elisp的有区别吗? 我从任一资源学习。

Answer 1:

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


Answer 2:

雷纳的回答讨论,您可以使用的功能 ,可以不与符号功能做的,即检索的词法范围的功能价值做的事情,但也有一些其他的差异太大。

特殊运算符功能

在特殊操作功能提供了一种方法找到一个名字的词汇环境功能价值。 它的参数可以是一个函数名或λ表达式。 这个功能可以采取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

另外还有访问fdefinition这是一种像符号功能是只能访问全局定义的功能,但有点像功能 ,它可以访问的符号和(SETF 名单。 但是,它不检索的lambda函数的值。



文章来源: How is sharp quote (#') different from symbol-function?