gpt4 book ai didi

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

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

关键字符号有什么区别

: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/

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