Random rumination on SWITCH: I think part of the evaluate-or-not confusion comes from C. There it's common to have #define'd names as keys, which means that non-evaluation of the keys is not an issue. One option would be to specify that keys must either be non-symbol atoms, or CONSTANTP symbols (evaluated), so (switch (value) (numeric-constant-1 ...) (numeric-constant-2 ...)) (switch (value :test string-equal) (:keyword-1 ...) (:keyword-2 ...)) and (define-symbol-macro foobar "foobar") (switch (value :test equal) ("bar" ...) ("foo" ...) (foobar ...)) would all work nicely, but (switch (value) (local-var ...)) would not be legal. The formulation or "non-symbol atom or CONSTANTP symbol" seems pretty arbitrary, though. Cheers, -- Nikodemus