【问题标题】:Why getf does not work for these keywords in Common Lisp?为什么 getf 不适用于 Common Lisp 中的这些关键字?
【发布时间】:2021-08-05 16:09:13
【问题描述】:

我可以使用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| 格式的数据。

【问题讨论】:

    标签: common-lisp keyword


    【解决方案1】:

    有两个问题。

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

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

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

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

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

    【讨论】:

    • 也许你想要:|name|而不是|:name|
    • 我不知道他为什么想要这些,而不是通常的:name
    • 我正在遵循其他问题的建议:stackoverflow.com/questions/68597256/…
    • 并将输入更改为其他问题的建议输出。无论如何,您的帮助对于理解符号技巧很有用。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-18
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多