不能将 acons 添加到空列表中

Cannot acons onto an empty list

有人知道您是否应该能够将 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> 

acons returns 一个新缺点,它不修改提供的关联列表。您可以使用 setf,但是:

CL-USER> (defparameter packages '())
PACKAGES

CL-USER> packages
NIL

CL-USER> (acons "AER" (make-hash-table :test 'equal) packages)
(("AER" . #<HASH-TABLE :TEST EQUAL :COUNT 0 {1002AB6493}>))

CL-USER> packages
NIL

CL-USER> (setf packages (acons "AER" (make-hash-table :test 'equal) packages))
(("AER" . #<HASH-TABLE :TEST EQUAL :COUNT 0 {1002ACC713}>))

CL-USER> packages
(("AER" . #<HASH-TABLE :TEST EQUAL :COUNT 0 {1002ACC713}>))