2016-08-06 22 views
1

Ich bin neu zu lisp und ich bin auf der Suche nach einer Funktion, um eine gespeicherte an Ort und Stelle zu tun, gibt es keine? Ich habe das pushnew-Makro gefunden, aber es funktioniert anscheinend nicht auf Listen.Wie an Ort und Stelle gespeichert in lisp angrenzenden

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

Antwort

2

PUSHNEW ist die modifizierende Version von ADJOIN. Sie müssen das richtige :TEST Argument für den Vergleich der Art der Elemente verwenden, die die Liste enthält (wie #'EQUAL für Listen).

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))