common-lisp - 为什么 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.:如果有必要,我可以更改以前的工作,即返回带有格式的数据。
解决方案
有两个问题。
首先,转义符号可以防止大小写折叠。因此,使用管道,您将获得小写符号,而不是默认的大写符号(除非您已修改(readtable-case *readtable)
)。
其次,放在:
管道内使其成为符号名称中的文字字符,而不是关键字包前缀。因此,您在当前包中创建了一个普通符号,而不是关键字。
:name
是包中命名的"NAME"
符号KEYWORD
。|:name|
是包中命名的":name"
符号CL-USER
。
不在包中的符号KEYWORD
不会自动评估自己。所以你需要报价|:name|
。这将起作用:
(getf odd-list-keys '|:name|)
推荐阅读
- reactjs - 如何使用带有钩子的 api 数据资源
- mysql - AWS DMS - MYSQL 上的 CDC 作为源端点的微秒精度
- python - 在 Python 发出 post 请求时如何调用函数?
- c++ - 我可以使用 Openssl C 库的哪些 API 来验证内容 id_rsa-cert.pub 文件?
- python - 取消绘制某个区域内的所有对象 Python 图形
- mysql - 计算两个文本列中匹配字符数的 SQL 查询
- python - django 属性错误 ------>AttributeError: module 'django.contrib.auth.views' has no attribute 'login', 'logout'
- powerapps - 如何在 PowerApps 中取消选择选定的库?
- r - 添加第二个轴以绘图而不同时添加跟踪
- javascript - 使用手机时 Socket.io 不显示连接