[parenscript-devel] Keyword arguments and quoted symbols in Parenscript
Red Daly
reddaly at gmail.com
Sun Apr 26 02:25:50 UTC 2009
On Sat, Apr 25, 2009 at 12:02 PM, Daniel Gackle <danielgackle at gmail.com>wrote:
> If I understand correctly, then yes, we object.
>
> We have a lot of code that uses keywords as standalone values (e.g. tokens
> in an AST), not keyword args to functions.
It's important to have a way of treating keywords that allows for both of
> these usages. In other words, a keyword's presence in a lambda list might be
> (A) the name of a keyword arg or (B) a regular old function arg (a runtime
> value).
What do you mean by "a runtime value?" In the current Parenscript keywords
are compiled to the variable with the same name as the symbol. If you
wanted a variable reference, you could replace a form like (foo :bar whiz)
to (foo bar whiz).
> The trouble with the old implementation of keyword args in PS is that it
> forced interpretation (A) on all keywords in lambda lists, breaking a good
> many of our functions.
I am still confused about what functions this assumption is breaking, since
quoted symbols are not translated into a JS equivalent. Can you provide a
concrete example?
> The code that's in PS right now supports both usages. It relies on the JS
> "arguments" keyword to allow functions with keyword args to pick out the
> dynamic portion of their lambda list without requiring them to be bundled
> into a magic JSON object under-the-hood. That magic JSON object caused us
> some trouble as well.
The magic JSON object should be transparent to you when you define keyword
arguments. That is, unless you are talking about a &rest or
&keyword-object, both of which operate differently for parenscript functions
than lisp functions.
> We have a layer of our system written in a subset of CL that we are able to
> compile into PS using macros. (This has critical business value as it allows
> us to do some things which our competitors cannot.)
This is a slick feature of Parenscript. Hopefully at some point we will see
a full lisp -> javascript converter so that more code can be shared between
client/server. Parenscript already does a lot more than any other solution
out there for client/server code compatability (besides writing the server
side in Javascript).
> The magic JSON object created an impedance mismatch with Lisp that made it
> impossible for us to write code in this subset that used keyword args (we'd
> have to write a separate JS version to suck function args out of the JSON
> object, which has no counterpart on the Lisp side). In general, although I'm
> skeptical of attempts to make PS overly Lispy in ways that don't have good
> equivalents in JS semantics, I also think that where there are opportunities
> to align Lisp and PS semantics naturally, we should do so.
Daniel
Agreed, for Parenscript. I would prefer true Lisp that compiles to
Javascript, but I don't think that's what Parenscript should be.
-Red
>
>
> On Sat, Apr 25, 2009 at 9:38 AM, Red Daly <reddaly at gmail.com> wrote:
>
>> Hello ParenScripters,
>>
>> I have modified the behavior of keywords found in Parenscript source to be
>> parsed into (PS-QUOTE keyword) instead of (JS-VARIABLE keyword). This seems
>> to make more sense because in Lisp, evaluating a keyword yields the keyword
>> itself rather than the value bound to it. As a result, the ability to paass
>> keyword arguments to functions is now restored.
>>
>> CL-USER> (ps:ps (foo "bar" :quix "quo" :etc "etc..."))
>> "foo('bar', { quix : 'quo', etc : 'etc...' });"
>>
>> Whereas this used to yield foo('bar', quix, 'quo', etc, 'etc...')
>>
>> In general, symbols occupy a strange place in Parenscript. Javascript has
>> no analogue of Lisp symbols, so there is no sensible translation of symbols
>> that works for everyone. Nonetheless, quoted symbols are used in many
>> Parenscript macros to fake having real symbols in javascript. We could
>> build in the ability to translate symbols to some javascript form, e.g.
>>
>> (ps:ps (make-instance 'animal)) => makeInstance( symbolTable["ANIMAL"] )
>>
>> The latter part of this post is just food for thought. I will go ahead
>> and commit the patch for the former part of this post unless someone
>> objects.
>>
>> Red
>>
>> _______________________________________________
>> parenscript-devel mailing list
>> parenscript-devel at common-lisp.net
>> http://common-lisp.net/cgi-bin/mailman/listinfo/parenscript-devel
>>
>>
>
> _______________________________________________
> parenscript-devel mailing list
> parenscript-devel at common-lisp.net
> http://common-lisp.net/cgi-bin/mailman/listinfo/parenscript-devel
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/parenscript-devel/attachments/20090425/51ff61a5/attachment.html>
More information about the parenscript-devel
mailing list