[Laszlo-dev] designing API which is LZX friendly
and Javascript-friendly
Max Carlson
max at laszlosystems.com
Mon Nov 28 12:34:54 PST 2005
Remember, we now have a CSS preprocessing phase on the server. I've
been advocating an XSLT transformation phase for both LZX and
LPS-proxied data for a while. But I _hate_ xslt syntax...
-Max
Jim Grandy wrote:
> I imagine we could also design something that uses XSLT as an
> implementation detail but has a more friendly syntax. A declarative
> syntax like Dylan's would be really nice. Here's the first example in
> the chapter referenced in my reply:
>
> define macro if-else
> { if-else (?test:expression, ?true:expression, ?false:expression) }
> => { if (?test) ?true else ?false end }
> end macro if-else;
>
> I'd really like to work on a proposal for this. Tucker's reference to
> JSE is intriguing -- it's based on the Dylan macro system, which David
> Moon worked on -- but I think we can do something even simpler if we
> stick to XML transformation.
>
> jim
>
> On Nov 28, 2005, at 10:34 AM, Henry Minsky wrote:
>
>> I definitely was thinking about some kind of def-macro facility when
>> trying to come up with ways to do this. I don't have any experience
>> with macros except for in LISP, so I don't really know what such a
>> facility would look like. It occurred to me that if you
>> had a Rhino javascript interpreter in the compiler, you could write
>> some kind of macro
>> in Javascript, which would probably be a better idea than coming up
>> with yet another
>> syntax for people to try to learn. XSLT is probably a much better
>> match for XML, but it's syntax is so yucky that I would hate to force
>> people to use it for anything.
>>
>> I guess if we have the E4X stuff (XML APi for Javascript), then
>> writing XML transformers in Javascript would not be so bad. Maybe we
>> could punt the XML compiler phase of the existing compiler and write
>> all the LZX language stuff as javascript macros...
>>
>>
>>
>>
>> On 11/28/05, *Jim Grandy* <jgrandy at laszlosystems.com
>> <mailto:jgrandy at laszlosystems.com>> wrote:
>>
>> I'm very interested in these questions, as well. Max and I have
>> discussed making the components purely data-driven, that is,
>> implemented so that list items (for example) are always
>> instantiated by replicating from a dataset. Max believes this
>> would simplify the design of the components significantly. The
>> issue is how to support this syntax:
>>
>> <menu>
>> <textlistitem>a</textlistitem>
>> <textlistitem>b</textlistitem>
>> </menu>
>>
>> We need the same sort of magic you are describing, to transform
>> that syntax into essentially this:
>>
>> <menu>
>> <dataset name="ds">
>> <item text="a"/>
>> <item text="b"/>
>> </dataset>
>> <textlistitem datapath="local:parent.ds:/item">
>> </menu>
>>
>> Then the replication timing can be controlled, things moved
>> around, etc., during the transform step.
>>
>> So in your case, the transformation would implement the
>> declarative syntax in terms of an imperative (script-y) syntax.
>>
>> Would it be going to far to propose a compile-time
>> pattern-matching transform stage? Kind of like hygienic macros in
>> Scheme ([1] or [2]) or Dylan [3], but perhaps more XSLT-arific. I
>> imagine something like that could be used in lots of other ways.
>>
>> [1] http://www.schemers.org/Documents/Standards/R5RS/HTML/r5rs-Z-H-7.html#%25_sec_4.3
>> <http://www.schemers.org/Documents/Standards/R5RS/HTML/r5rs-Z-H-7.html#%25_sec_4.3>
>> [2] http://www.scheme.com/tspl3/syntax.html#./syntax:h0
>> [3] http://www.gwydiondylan.org/books/dpg/db_329.html
>>
>> jim
>>
>> On Nov 28, 2005, at 8:29 AM, Henry Minsky wrote:
>>
>>>
>>>
>>>
>>> Here is a design issue that I am having with the context menu stuff,
>>> which I'd like some developer feedback on. It is a general issue of
>>> how to build an API that works well for both LZX (XML) style coding,
>>> and also works well for scripting style coding.
>>>
>>>
>>> PTW suggested something like the following API for LZX for the
>>> right click menu:
>>>
>>> <view width="100" height="100" bgcolor="#cccccc" name="v1">
>>> <contextmenu name="mycmenu" hidebuiltins="true">
>>> <contextmenuitem name="item1"
>>> onselected="parent.parent.showSelectItem('item1')">
>>> Item 1
>>> </contextmenuitem>
>>> <contextmenuitem name="item2"
>>> onselected="parent.parent.showSelectItem('item2')">
>>> Item 2
>>> </contextmenuitem>
>>> </contextmenu>
>>> </view>
>>>
>>>
>>> Now, if I implement something like that, there are a number of
>>> things
>>> that need to happen automatically when the classes are
>>> instantiated. The "contextmenuitem" needs to place itself into the
>>> parent "contextmenu" instance, and the "contextmenu" needs to
>>> install
>>> itself into the parent view.
>>>
>>>
>>> However, if you are creating and manipulating menus and menu items at
>>> runtime, my feeling is that you do not want these things to happen
>>> automatically for you, you want to have manual control over
>>> instantiating menu items, setting their callbacks, installing them
>>> into menus, and installing the menu itself onto a view.
>>>
>>> I have a scripting API that looks like this:
>>>
>>> <view width="100" height="100" bgcolor="#cccccc" name="v1">
>>> <method event="oninit">
>>> var cm = new LzContextMenu();
>>> var item1 = cm.makeMenuItem('my item1', new LzDelegate(this,
>>> "handlerightclick1"));
>>> var item2 = cm.makeMenuItem('my item2', new LzDelegate(this,
>>> "handlerightclick2"));
>>> cm.addItem(item1);
>>> cm.addItem(item2);
>>> this.setContextMenu(cm);
>>> Debug.write(cm);
>>> </method>
>>>
>>>
>>> I don't necessesarily want to have the contextmenu items install
>>> themselves automatically into the parent menu when they are
>>> instantiated; I might want to put them in a different order that the
>>> instantiation order. And I don't necessarily want to install the menu
>>> as soon as I create it, I may want to pre-instantiate the menu
>>> object,
>>> but wait until some other event to actually install it on a view.
>>>
>>> So the question is, how do you suppress the "automatic" behavior of
>>> the menu item objects when you are instantiating from script. This
>>> seems like a general issue, which must come up in other cases, where
>>> people want to instantiate list menus, comboboxes, etc, at
>>> runtime. Are there a set of guidelines for designing APIs which are
>>> friendly both for LZX and Javascript?
>>>
>>>
>>>
>>>
>>>
>>> --
>>> Henry Minsky
>>> Software Architect
>>> hminsky at laszlosystems.com <mailto:hminsky at laszlosystems.com>
>>>
>>> _______________________________________________
>>> Laszlo-dev mailing list
>>> Laszlo-dev at openlaszlo.org <mailto:Laszlo-dev at openlaszlo.org>
>>> http://www.openlaszlo.org/mailman/listinfo/laszlo-dev
>>> <http://www.openlaszlo.org/mailman/listinfo/laszlo-dev>
>>
>>
>>
>>
>>
>> --
>> Henry Minsky
>> Software Architect
>> hminsky at laszlosystems.com <mailto:hminsky at laszlosystems.com>
>>
>> _______________________________________________
>> Laszlo-dev mailing list
>> Laszlo-dev at openlaszlo.org <mailto:Laszlo-dev at openlaszlo.org>
>> http://www.openlaszlo.org/mailman/listinfo/laszlo-dev
>
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Laszlo-dev mailing list
> Laszlo-dev at openlaszlo.org
> http://www.openlaszlo.org/mailman/listinfo/laszlo-dev
More information about the Laszlo-dev
mailing list