关键字符号有什么区别
: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>
:foo
是 keyword:foo
的缩写。因此符号在关键字包中并被导出。
CL-USER 21 > keyword:foo
:FOO
所以关键字符号是关键字包中的自求值常量符号。它们用作数据结构和关键字参数列表中的标记。好处:您无需纠结于软件包,它们会自行评估 - 因此不需要报价。
关于lisp - 关键字符号和带引号的符号有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23969203/