如何在lisp中存储到位

时间:2016-08-06 10:57:39

标签: lisp common-lisp

我是lisp的新手,我正在寻找一个存储到位的功能,是否有?我找到了pushnew宏,但它似乎适用于不是列表的项目。

(pushnew '((1)) '((1) (1 2) (1 2 3)))
(pushnew '(1) lst) => ((1) (1) (1 2) (1 2 3))

1 个答案:

答案 0 :(得分:2)

PUSHNEWADJOIN的修改版本。您需要使用正确的: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))