为什么有必要在某些情况下将#'放在Lisp中?

时间:2012-03-07 03:45:58

标签: syntax lisp

  

可能重复:
  What does # mean in LISP

我正在学习lisp,但有一件事我不明白是为什么有必要使用#'。如果存在具有特定名称的函数,为什么lisp会认为它是变量? 例如:

>(remove-if-not #'evenp '(1 2 3 4 5 6 7 8 9 10))
 (2 4 6 8 10)

2 个答案:

答案 0 :(得分:4)

像Common Lisp这样的一些lisps需要这个。其他人,比如Scheme,不会。

您需要这样做,因为您使用的Lisp具有单独的命名空间,而不是“普通”变量。如果省略#',则符号evenp将被解释为引用“正常”(非功能)命名空间。

答案 1 :(得分:3)

读取语法

#'X

完全相同
(FUNCTION X)

(功能X)粗略地表示“解析函数名称空间中的符号X”。没有它,X被评估为变量。函数和变量位于Common Lisp中的不同命名空间中。这是一条规则。

关于这个问题,为什么Lisp会认为它是一个变量?让我们换一种方式:假设有两个命名空间,为什么Lisp只有在没有歧义的情况下才会自动退回到另一个?原因是与Lisp-1或Lisp-2相比,这将是一个黑客,比其中任何一个都差。 Lisp-1和Lisp-2是Lisp文化中使用的词,用于指代具有变量的单个名称空间和具有两个名称空间的方言。

如果你想了解更多关于以这种或那种方式做到这一点的利弊,肯特皮特曼和理查德加布里埃尔在本文中都是如此:http://www.nhplace.com/kent/Papers/Technical-Issues.html [功能细胞和价值细胞中分离的技术问题]

顺便说一句:您可以改为使用'FUNC或(QUOTE FUNC):(删除 - 如果不是'偶数...)。这是一个非常晚的绑定机制,贯穿符号,不适用于词法函数。它可能不会非常有效地编译。通过'FUNC调用总是必须通过符号进行查找,而#'FUNC(至少在某些重要情况下)可以进行优化。