Hello,
I thought that the whole purpose of switch was to compare some value to the result of evaluated forms. I don't think it is nice to impose a restriction that avoid using evaluated variables and forms, and I didn't quite understand why it should.
As for allow either an atom or a list of forms, I don't like it very much, but it should be more or less ok. Some particular cases should be analyzed first, though, like
(switch (something)
('some-symbol ...)
(*some-variable* ...)
...)
It could lead to a wrong interpretation unless you explicitly test if the first symbol of your list is quote. Another solution is to require the user to write more parenthesis
(switch (something)
(('some-symbol) ...)
(*some-variable*
...)
...)
An alternative to avoid this and other problems (e.g. excessive parenthesis) is to allow the use of some key, like:
(switch (something)
((:any value1 value2 ...) ...)
((car some-list)
...)
...)
In my opinion, this would be much better. Using the key :member instead of :any would be a good option too.
Cheers,
Gustavo.