为什么 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)
)。
其次,将 :
放在管道内使其成为符号名称中的文字字符,而不是关键字包前缀。所以你在当前包中创建了一个普通符号,而不是关键字。
:name
是 KEYWORD
包中名为 "NAME"
的符号。 |:name|
是 CL-USER
包中名为 ":name"
的符号。
不在 KEYWORD
包中的符号不会自动对其自身求值。所以需要引用|:name|
。这将起作用:
(getf odd-list-keys '|:name|)
我可以使用 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)
)。
其次,将 :
放在管道内使其成为符号名称中的文字字符,而不是关键字包前缀。所以你在当前包中创建了一个普通符号,而不是关键字。
:name
是 KEYWORD
包中名为 "NAME"
的符号。 |:name|
是 CL-USER
包中名为 ":name"
的符号。
不在 KEYWORD
包中的符号不会自动对其自身求值。所以需要引用|:name|
。这将起作用:
(getf odd-list-keys '|:name|)