为什么 getf 对 Common Lisp 中的这些关键字不起作用?

Why getf does not work for these keywords in Common Lisp?

我可以使用 getf 来提取列表中的值:

CL-USER>(defvar regular-list-keys '(:name "pedro" :value "2985"))
REGULAR-LIST-KEYS

CL-USER> (getf regular-list-keys :name)
"Pedro"

CL-USER> (getf regular-list-keys :value)
"2985"

好的。在处理 |:keywords|:

时,我期待同样的事情发生
CL-USER> (defvar odd-list-keys '(|:name| "jazoest" |:value| "2985" |:type| "hidden"))
ODD-LIST-KEYS
CL-USER> (getf odd-list-keys :name)
NIL
CL-USER> (getf odd-list-keys |:name|)
error

为什么会这样?我该如何解决这个问题?

Obs.: 如果有必要,我可以更改以前的工作,它返回的数据为 |:foo| 格式。

有两个问题。

首先,转义符号可以防止大小写折叠。因此,对于管道,您会得到小写符号,而不是默认的大写符号(除非您修改了 (readtable-case *readtable))。

其次,将 : 放在管道内使其成为符号名称中的文字字符,而不是关键字包前缀。所以你在当前包中创建了一个普通符号,而不是关键字。

:nameKEYWORD 包中名为 "NAME" 的符号。 |:name|CL-USER 包中名为 ":name" 的符号。

不在 KEYWORD 包中的符号不​​会自动对其自身求值。所以需要引用|:name|。这将起作用:

(getf odd-list-keys '|:name|)