lisp - 关键字符号和带引号的符号有什么区别?

标签 lisp common-lisp symbols

关键字符号有什么区别

:foo

和引号:

'foo

两者都代表自己,可以用作标识符。我可以看到关键字符号主要用于命名参数,但我在问自己是否也不能使用引号来实现它?

换句话说:为什么我需要两者?

最佳答案

首先:'something(quote something) 的缩写。读者会将引号字符转换为一个列表,其中符号 cl:quote 作为第一项。对于求值器来说,这意味着:不求值 something,只是将其作为结果返回。

CL-USER 22 > '(quote foo)
(QUOTE FOO)

CL-USER 23 > ''foo
(QUOTE FOO)

CL-USER 24 > (read-from-string "'foo")
(QUOTE FOO)

冒号 : 是包标记。如果缺少包名称,则符号位于 KEYWORD 包中。

我们可以给foo一个值:

CL-USER 11 > (setq foo 10)
10

foo 计算出它的值。

CL-USER 12 > foo
10

引用符号的计算结果为符号。

CL-USER 13 > 'foo
FOO

我们不能给 :foo 一个值:

CL-USER 14 > (setq :foo 10)

Error: Cannot setq :FOO -- it is a keyword.
  1 (abort) Return to level 0.
  2 Return to top loop level 0.

Type :b for backtrace or :c <option number> to proceed.
Type :bug-form "<subject>" for a bug report template or :? for other options.

CL-USER 15 : 1 > :top

:foo 已经有一个值: itself。

CL-USER 16 > :foo
:FOO

自然地,引用的 :foo 计算为 :foo

CL-USER 17 > ':foo
:FOO

符号 foo 在一些包中,这里是 CL-USER

CL-USER 18 > (symbol-package 'foo)
#<The COMMON-LISP-USER package, 92/256 internal, 0/4 external>

:foo 符号在KEYWORD 包中。

CL-USER 19 > (symbol-package ':foo)
#<The KEYWORD package, 0/4 internal, 6230/8192 external>

由于 :foo:foo 的值,我们还可以这样写:

CL-USER 20 > (symbol-package :foo)
#<The KEYWORD package, 0/4 internal, 6230/8192 external>

:fookeyword:foo 的缩写。因此符号在关键字包中并被导出。

CL-USER 21 > keyword:foo
:FOO

所以关键字符号是关键字包中的自求值常量符号。它们用作数据结构和关键字参数列表中的标记。好处:您无需纠结于软件包,它们会自行评估 - 因此不需要报价。

关于lisp - 关键字符号和带引号的符号有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23969203/

相关文章:

common-lisp - 我可以在他们的扩展站点中获取宏的边界吗?

lisp - 为什么我的 lisp 程序没有运行?

ruby-on-rails - 向 Symbol 添加 to_str 方法有什么负面影响?

R如何将一个函数作为字符串传递给另一个函数

scheme - Racket\Scheme 中的返回类型

math - LISP 中的计数器变量

lisp - ecl_init_module 中的第一个参数是做什么的?

enums - Common Lisp 中的可比较(可排名/可排序)枚举

java - 如何在 Android 应用程序上打印 native 符号?

printing - 为什么我的结果是 (# # #)?