I like defpat. It looks soegaard's scheme solution does allow things like the a_Symbol check, right? Also, mathematica does allow destructuring arbitrarily complex lists:
The problem in a lisplike is how to properly embed checks in destructuring binds. Since code represenetation == data representation, it's rather difficult to do:
(defpat foo
(x (isa x 'sym))
(list x isa))
As it is, I'm already forbidding one symbol from being used for variables: quote. This is so that I can support: