如何在 lisp 中存储就地连接
How to do stored in place adjoin in lisp
我是 lisp 的新手,我正在寻找一个函数来执行存储就地连接,有吗?我找到了 pushnew 宏,但它似乎适用于项目而不是列表。
(pushnew '((1)) '((1) (1 2) (1 2 3)))
(pushnew '(1) lst) => ((1) (1) (1 2) (1 2 3))
PUSHNEW
是 ADJOIN
的修改版本。您需要使用正确的 :TEST
参数来比较列表包含的元素类型(例如 #'EQUAL
用于列表)。
CL-USER> (defparameter *list* (list (list 1)
(list 1 2)
(list 1 2 3)))
*LIST*
CL-USER> (adjoin '(1) *list*) ; Adds
((1) (1) (1 2) (1 2 3))
CL-USER> (adjoin '(1) *list* :test #'equal) ; Doesn't add
((1) (1 2) (1 2 3))
CL-USER> (pushnew '(1) *list*) ; Pushes
((1) (1) (1 2) (1 2 3))
CL-USER> *list*
((1) (1) (1 2) (1 2 3))
CL-USER> (pushnew '(1) *list* :test #'equal) ; Doesn't push
((1) (1) (1 2) (1 2 3))
我是 lisp 的新手,我正在寻找一个函数来执行存储就地连接,有吗?我找到了 pushnew 宏,但它似乎适用于项目而不是列表。
(pushnew '((1)) '((1) (1 2) (1 2 3)))
(pushnew '(1) lst) => ((1) (1) (1 2) (1 2 3))
PUSHNEW
是 ADJOIN
的修改版本。您需要使用正确的 :TEST
参数来比较列表包含的元素类型(例如 #'EQUAL
用于列表)。
CL-USER> (defparameter *list* (list (list 1)
(list 1 2)
(list 1 2 3)))
*LIST*
CL-USER> (adjoin '(1) *list*) ; Adds
((1) (1) (1 2) (1 2 3))
CL-USER> (adjoin '(1) *list* :test #'equal) ; Doesn't add
((1) (1 2) (1 2 3))
CL-USER> (pushnew '(1) *list*) ; Pushes
((1) (1) (1 2) (1 2 3))
CL-USER> *list*
((1) (1) (1 2) (1 2 3))
CL-USER> (pushnew '(1) *list* :test #'equal) ; Doesn't push
((1) (1) (1 2) (1 2 3))