首页 > 解决方案 > 为什么 getf 不适用于 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

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

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

标签: common-lispkeyword

解决方案


有两个问题。

首先,转义符号可以防止大小写折叠。因此,使用管道,您将获得小写符号,而不是默认的大写符号(除非您已修改(readtable-case *readtable))。

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

:name是包中命名的"NAME"符号KEYWORD|:name|是包中命名的":name"符号CL-USER

不在包中的符号KEYWORD不​​会自动评估自己。所以你需要报价|:name|。这将起作用:

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

推荐阅读