lisp - 为什么在 LISP 中不需要#'(尖引号)符号?

标签 lisp common-lisp clisp

我正在从“Practical Common Lisp”一书中学习 Lisp。有一次,我应该输入以下代码:

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

我想这里的想法当然是 remove-if-not 想要一个函数,当给它提供一个参数时,它可以返回 T 或 NIL,然后这个函数被应用到列表中的所有符号,返回一个仅包含返回 NIL 的那些符号的列表。

但是,如果我现在在 CLISP 中编写以下代码:

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

它仍然有效!所以我的问题是,我是否使用尖引号表示法,或者只使用引号就足够了吗?现在看来,额外的升号只是为了让程序员知道“嘿,这是一个函数,而不仅仅是一些随机符号!” - 但如果它有任何其他用途,我很想知道。

我使用 GNU CLISP 2.49(2010 年 7 月 7 日,天哪,它实际上已经很老了)。

最佳答案

Sharp-quote 和 quote 在一般情况下没有相同的行为:

(defun test () 'red)

(flet ((test () 'green))
  (list (funcall 'test)
        (funcall #'test))) => (red green)

调用带引号的符号将使用带引号的函数值(即 symbol-function 的结果)。调用尖引号符号将使用由该符号的词法绑定(bind)(如果有)建立的值。在公认的常见情况下,没有词汇绑定(bind),行为将是相同的。这就是您所看到的。

你应该养成使用尖引号的习惯。忽略函数绑定(bind)可能不是您想要的,并且可能会让任何试图理解您的代码的人感到困惑。

关于lisp - 为什么在 LISP 中不需要#'(尖引号)符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21410233/

相关文章:

lisp - sbcl Common Lisp incf 警告

emacs - 当我将我的 emacs 与 purcell 的 .emacs.d 一起使用时,我无法使用 slime

emacs - 在 emacs 中,如何绑定(bind) C-l 以清除粘液中的屏幕?

ssl - Common Lisp 中基于 SSL/TLS 的 Pop3

loops - LOOP关键字列表

LISP 回溯

lisp - 将 lisp 命令回显到标准输出

common-lisp - 如何更改SBCL的当前目录?

linux - 如何在 Redhat Linux 中安装 CLISP

Emacs 口齿不清 : make newly-created buffer visible before the function returns?