Common lisp 无法将ACON添加到空列表中

Common lisp 无法将ACON添加到空列表中,common-lisp,Common Lisp,有人知道你是否应该将acons添加到空列表中吗?我看不出有什么说你不能,但在SBCL上: RDATA> (defparameter packages ()) RDATA> packages NIL RDATA> (acons "AER" (make-hash-table :test 'equal) packages) (("AER" . #<HASH-TABLE :TEST EQUAL :COUNT 0 {1012B2C8B3}&g

有人知道你是否应该将acons添加到空列表中吗?我看不出有什么说你不能,但在SBCL上:

RDATA> (defparameter packages ())
RDATA> packages
NIL
RDATA> (acons "AER" (make-hash-table :test 'equal) packages)
(("AER" . #<HASH-TABLE :TEST EQUAL :COUNT 0 {1012B2C8B3}>))
RDATA> packages
NIL
RDATA> (push (cons "AES" (make-hash-table :test 'equal)) packages)
(("AES" . #<HASH-TABLE :TEST EQUAL :COUNT 0 {1013225A03}>))
RDATA> packages
(("AES" . #<HASH-TABLE :TEST EQUAL :COUNT 0 {1013225A03}>))
RDATA> 
RDATA>(defparameter包())
RDATA>软件包
无
RDATA>(acons“AER”(使哈希表:测试“相等”)包)
(“AER.”)
RDATA>软件包
无
RDATA>(推送(cons“AES”(使哈希表:test'equal))包)
((“AES”))
RDATA>软件包
((“AES”))
RDATA>
返回一个新的cons,它不会修改提供的关联列表。您可以使用
setf
,但是:

CL-USER>(defparameter包'())
包装
CL-USER>软件包
无
CL-USER>(acons“AER”(使哈希表:测试“相等”)包)
(“AER.”)
CL-USER>软件包
无
CL-USER>(setf包(acons“AER”(使哈希表:测试“相等”)包)
(“AER.”)
CL-USER>软件包
(“AER.”)
返回一个新的cons,它不会修改提供的关联列表。您可以使用
setf
,但是:

CL-USER>(defparameter包'())
包装
CL-USER>软件包
无
CL-USER>(acons“AER”(使哈希表:测试“相等”)包)
(“AER.”)
CL-USER>软件包
无
CL-USER>(setf包(acons“AER”(使哈希表:测试“相等”)包)
(“AER.”)
CL-USER>软件包
(“AER.”)

我明白了。常见的Lisp配方(第161页)文档似乎表明acons做了一个推送/反对。也许我读错了,因为它缺少示例。我会看一看,但是HyperSpec文档(在我的答案中链接)明确指出,
acons
创建了一个新的cons,甚至还显示了一个将
acons
应用于空列表的示例,其中显示了返回的列表和仍然为空的输入列表。您是在谈论Edi Weitz的常见Lisp配方吗?在p。159我看到脚注23:“例如,如果您使用ACONS添加一个条目,那么您不会修改旧的列表,而是创建一个新的列表;即,一个新的cons单元格。”此外,书中该部分使用的
ACONS
似乎都伴随着
setf
。它确实说,您可以使用
push
将新的一对推送到列表上,但提到的快捷方式在第页。159,使用
setf
修改
*a*
。我明白了。常见的Lisp配方(第161页)文档似乎表明acons做了一个推送/反对。也许我读错了,因为它缺少示例。我会看一看,但是HyperSpec文档(在我的答案中链接)明确指出,
acons
创建了一个新的cons,甚至还显示了一个将
acons
应用于空列表的示例,其中显示了返回的列表和仍然为空的输入列表。您是在谈论Edi Weitz的常见Lisp配方吗?在p。159我看到脚注23:“例如,如果您使用ACONS添加一个条目,那么您不会修改旧的列表,而是创建一个新的列表;即,一个新的cons单元格。”此外,书中该部分使用的
ACONS
似乎都伴随着
setf
。它确实说,您可以使用
push
将新的一对推送到列表上,但提到的快捷方式在第页。159,使用
setf
修改
*a*