I ran into a bug in ps::case (patch below). The trouble occurs when one of the keys that case is trying to match on is quoted:
(ps::ps-macroexpand '(case val ('a (b))))
=> (SWITCH VAL (QUOTE) (A (B)))
This yields the following nonsensical js:
"switch (val) {
case quote:
case a:
b();};"
A better macroexpansion would avoid processing the quoted form like a list, yielding:
(SWITCH VAL ('A (B)))
This doesn't produce any javascript, but rather an error:
(ps (case val '(a (b))))
=> Cannot translate quoted value A to javascript
[Condition of type SIMPLE-ERROR]
... which is the desired behavior, because PS always produces this error when encountering a quoted form it doesn't understand.
The reason this came up is that I'm building a specialized compiler on top of PS that handles quoted forms by turning them into strings. I've got this to work by means of :around methods on ps::compile-parenscript-form. But now the above bug with ps::case becomes a show-stopper because I need it to work with quoted keys (not just signal an error). I fixed it like so:
hunk ./src/special-forms.lisp 189
- (cond ((listp val)
+ (cond ((and (listp val) (not (eq (car val) 'quote)))
Could this fix please be added to PS?
Dan