gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:38:48 26 4
gpt4 key购买 nike

我正在从“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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com