[parenscript-devel] Bug: ps::case generates incorrect code on quoted keys

Daniel Gackle danielgackle at gmail.com
Wed Aug 20 04:19:15 UTC 2008


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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/parenscript-devel/attachments/20080819/fbdef644/attachment.html>


More information about the parenscript-devel mailing list