【发布时间】:2019-10-13 17:19:41
【问题描述】:
乍一看,有一个返回符号名称的函数似乎有点愚蠢,必须使用相同符号的名称来调用它。即在调用上下文中函数将返回什么应该已经很明显了。另一方面,identity 有时很有用(我忘了刚才在哪里),但我认为(也许是错误的)symbol-function 存在的原因不仅仅是作为一种身份。
不过,hyperspec 提供了一个可能的提示:
(symbol-name 'temp) => "TEMP"
(symbol-name :start) => "START"
(symbol-name (gensym)) => "G1234" ;for example
我注意到:start 表示从关键字包中获取符号start 的名称,其中关键字包简单地用: 表示。
(:keyword 是它的较长形式,不需要使用)。因此,在这种情况下,symbol-name 扮演着简单删除包前缀的角色。
它可能做的另一件事是,如果实现不区分大小写,它将通过删除提供的符号名称中的大小写来获取实际名称。
大概是这样还是我缺少这个功能有什么重要性?
我对符号感到困惑的一件事(现在澄清了)是symbol-plist 并没有告诉您有关符号的所有信息(例如,它是否包含特殊变量或函数的值)。相反,plist 是一个主要的遗留功能,现在很大程度上被哈希表取代。因此,即使在符号上设置了特殊变量,对 symbol-plist 的调用也会返回 NIL。
关于这个问题的最后一个问题,Paul Graham 在第 8 章 (p133) 中说,“您可以将符号用作数据对象和事物的名称,而无需了解两者之间的关系”。如果我们现在很少使用 plist 是否正确,那么今天我们通常根本不使用符号“作为数据对象”,而是只是作为事物的名称(当然在 CL 中具有二元性,即同时使用 symbol-function 和 symbol-value)。
【问题讨论】:
-
符号列表等价于 weak 哈希表
标签: common-lisp