(cons (subst new old (car tree) :key key :test test)
(subst new old (cdr tree) :key key :test test)))
(t tree)))
+
+(defmacro pop (place)
+ (let ((car-symbol (gensym)))
+ `(let ((,car-symbol (car ,place)))
+ (setf ,place (cdr ,place))
+ ,car-symbol)))
make-symbol mapcar member minusp mod multiple-value-bind
multiple-value-call multiple-value-list multiple-value-prog1
nconc nil not nreconc nth nthcdr null numberp or
- package-name package-use-list packagep parse-integer plusp
+ package-name package-use-list packagep parse-integer plusp pop
prin1-to-string print proclaim prog1 prog2 progn psetq push
quote read-from-string remove remove-if remove-if-not return
return-from revappend reverse rplaca rplacd second set setf
-; Tests for list functions
+;; Tests for list functions
+
+;; TODO: EQUAL doesn't compare lists correctly at the moment.
+;; Once it does the lists can be compared directly in many of these tests
; COPY-TREE
(test (let* ((foo '((1 2) (3 4)))
;; (SETF (CAR (CAR FOO)) 0) doesn't work in the test for some reason,
;; despite working fine in the REPL
(rplaca (car foo) 0)
- ;; TODO: EQUAL doesn't compare lists correctly at the moment.
- ;; Once it does the lists can be compared directly
(not (= (car (car foo))
(car (car bar))))))
; SUBST
; Can't really test this until EQUAL works properly on lists
+
+; POP
+(test (let* ((foo '(1 2 3))
+ (bar (pop foo)))
+ (and (= bar 1)
+ (= (car foo) 2))))