+;; CAR, CDR and variants
+(test (equal (car nil) nil))
+(test (equal (cdr '(1 . 2)) 2))
+(test (equal (cdr '(1 2)) '(2)))
+(test (equal (cadr '(1 2)) 2))
+(test (equal (car '(a b c)) 'a))
+(test (equal (cdr '(a b c)) '(b c)))
+(test (equal (caar '((1 2) 3)) 1))
+(test (equal (cadr '(1 2 3)) 2))
+(test (equal (cdar '((1 2) 3)) '(2)))
+(test (equal (cddr '(1 2 3)) '(3)))
+(test (equal (caaar '(((1)))) 1))
+(test (equal (caadr '(1 (2))) 2))
+(test (equal (cadar '((1 2))) 2))
+(test (equal (caddr '(1 2 3)) 3))
+(test (equal (cdaar '(((1 2)))) '(2)))
+(test (equal (cdadr '(1 (2 3))) '(3)))
+(test (equal (cddar '((1 2 3))) '(3)))
+(test (equal (cdddr '(1 2 3 4)) '(4)))
+(test (equal (caaaar '((((1))))) 1))
+(test (equal (caaadr '(1 ((2)))) 2))
+(test (equal (caadar '((1 (2)))) 2))
+(test (equal (caaddr '(1 2 (3))) 3))
+(test (equal (cadaar '(((1 2)))) 2))
+(test (equal (cadadr '(1 (2 3))) 3))
+(test (equal (caddar '((1 2 3))) 3))
+(test (equal (cadddr '(1 2 3 4)) 4))
+(test (equal (cdaaar '((((1 2))))) '(2)))
+(test (equal (cdaadr '(1 ((2 3)))) '(3)))
+(test (equal (cdadar '((1 (2 3)))) '(3)))
+(test (equal (cdaddr '(1 2 (3 4))) '(4)))
+(test (equal (cddaar '(((1 2 3)))) '(3)))
+(test (equal (cddadr '(1 (2 3 4))) '(4)))
+(test (equal (cdddar '((1 2 3 4))) '(4)))
+(test (equal (cddddr '(1 2 3 4 5)) '(5)))
+
+;; SUBLIS
+(test (equal (sublis '((x . 100) (z . zprime))
+ '(plus x (minus g z x p) 4 . x))
+ '(PLUS 100 (MINUS G ZPRIME 100 P) 4 . 100)))
+(test (equal (sublis '(((+ x y) . (- x y)) ((- x y) . (+ x y)))
+ '(* (/ (+ x y) (+ x p)) (- x y))
+ :test #'equal)
+ '(* (/ (- X Y) (+ X P)) (+ X Y))))
+(let ((tree1 '(1 (1 2) ((1 2 3)) (((1 2 3 4))))))
+ (test (equal (sublis '((3 . "three")) tree1)
+ '(1 (1 2) ((1 2 "three")) (((1 2 "three" 4))))))
+ (test (equal (sublis '((t . "string"))
+ (sublis '((1 . "") (4 . 44)) tree1)
+ :key #'stringp)
+ '("string" ("string" 2) (("string" 2 3)) ((("string" 2 3 44))))))
+ (test (equal tree1 '(1 (1 2) ((1 2 3)) (((1 2 3 4)))))))
+(let ((tree2 '("one" ("one" "two") (("one" "Two" "three")))))
+ (test (equal (sublis '(("two" . 2)) tree2)
+ '("one" ("one" "two") (("one" "Two" "three")))))
+ (test (equal tree2 '("one" ("one" "two") (("one" "Two" "three")))))
+ (test (equal (sublis '(("two" . 2)) tree2 :test 'equal)
+ '("one" ("one" 2) (("one" "Two" "three"))))))
+
+;; SUBST
+(let ((tree1 '(1 (1 2) (1 2 3) (1 2 3 4))))
+ (test (equal (subst "two" 2 tree1) '(1 (1 "two") (1 "two" 3) (1 "two" 3 4))))
+ (test (equal (subst "five" 5 tree1) '(1 (1 2) (1 2 3) (1 2 3 4))))
+ (test (eq tree1 (subst "five" 5 tree1))) ; Implementation dependent
+ (test (equal tree1 '(1 (1 2) (1 2 3) (1 2 3 4)))))
+(test (equal (subst 'tempest 'hurricane
+ '(shakespeare wrote (the hurricane)))
+ '(SHAKESPEARE WROTE (THE TEMPEST))))
+(test (equal (subst 'foo 'nil '(shakespeare wrote (twelfth night)))
+ '(SHAKESPEARE WROTE (TWELFTH NIGHT . FOO) . FOO)))
+(test (equal (subst '(a . cons) '(old . pair)
+ '((old . spice) ((old . shoes) old . pair) (old . pair))
+ :test #'equal)
+ '((OLD . SPICE) ((OLD . SHOES) A . CONS) (A . CONS))))
+