Re: [stack] XY implementation in JavaScript
Christopher Diggins <[email protected]>
| Newsgroups | gmane.comp.lang.concatenative |
|---|---|
| Message-ID | <[email protected]> |
Cool stuff. I also implemented Cat in JavaScript http://cat-language.com/interpreter.html. If you see anything you like feel free to reuse it, I've released the source code into the public domain. - Christopher On Mon, Feb 16, 2009 at 7:35 PM, Chris Double <[email protected]> wrote: > I've been playing around with an implementation of XY in JavaScript to > explore client side web programming in a concatenative language. XY is > one of Stevan Apter's language experiments: > > http://nsl.com/k/xy/xy.htm > > I've got the core of the language implemented and it's fun to play > around with and use as a simple learning tool. A simple > read/eval/print listener is available here: > > http://www.bluishcoder.co.nz/xyjs/xylistener.html > > Click somewhere on the page and then enter an expression. For example: > > [ 1 2 3 4 ] [ 2 * ] map . > > The '.' at the end will pop the last item off the X stack and print > it. This implementation has large integers, using a big number > implementation in JavaScript. So this works: > > ; fac dup 1 = [] [dup 1 - fac *] if ; > 100 fac . > > Or you can use linrec: > > 10 [dup 1 =] [] [dup 1 -] [*] linrec alert > > This 'alert' word displays a pop up alert box. Operations that take a > long time can hit the browsers 'kill long running scripts' message. > I'll do a workaround for this at some point. > > If you do a 'view source' on the page you'll see the library of XY > functions, taken from Stevan's page. The XY code is in an HTML script > block of type 'text/x-xy': > > <script type="text/x-xy"> > ; pop { a } ; > ; drop pop ; > ; dip swap => / <= ; > ; dup { a \a \a } ; > ; swap { [a b] \b \a } ; > </script> > > Not all of the included library works due to unimplemented core > library functions. XY uses primitives based on K. I don't know what > most of these are so I'm slowly working through them as I need to. > > There is a very simple JavaScript FFI to allow calling JavaScript > functions. A 'js-global' word evals a given string and returns a > JavaScript object: > > "document" js-global . > => js([object HTMLDocument]) > > A 'js-call' word calls a JavaScript function given an array of > arguments, the 'this' object, and the function object on the stack: > > [ [ "hello" alert ] >js-function / 1000 / ] "window" js-global > "window.setTimeout" js-global js-call > > The '>js-function' word converts an XY quotation to a JavaScript function. > > Continuations seem to work: > > [ "hello" . ] 0 call/cc "there" . > => "hello" > "there" > dup / > => "there" > dup / > => "there" > > In the listener Ctrl+Up and Ctrl+Down can be used to cycle through the > history of last entered commands. There's not much error checking or > reporting at the moment so errors tend to give obscure JavaScript > related messages. Also I've mainly tested on Firefox so other browsers > may or may not work. I believe Safari worked last time I tried. > > Another simple test page is: > > http://www.bluishcoder.co.nz/xyjs/xy.html > > Entering an expression and hitting 'Eval' will show each step as the > expression is evaluated. For example, 1 2 dup + *, gives: > > 1 -> 2 dup + * > 1 2 -> dup + * > 1 2 -> { a \ a \ a } + * > 1 2 { -> a \ a \ a } + * > 1 2 { a -> \ a \ a } + * > 1 2 { a \ -> a \ a } + * > 1 2 { a \ a -> \ a } + * > 1 2 { a \ a \ -> a } + * > 1 2 { a \ a \ a -> } + * > 1 -> \ 2 \ 2 + * > 1 2 -> \ 2 + * > 1 2 2 -> + * > 1 4 -> * > 4 -> > > The information on the left hand side of the '->' is the X stack, the > right hand side is the Y queue. > > The core builtin words at the moment are listed here: > > http://www.bluishcoder.co.nz/xyjs/xy.txt > > There is a 'source' word that outputs a quotation containing the > definition of a word: > > \ dup source . > => [ { a \ a \ a } ] > > Any suggestions or ideas for improving/adding to this would be appreciated. > > Chris. > -- > http://www.bluishcoder.co.nz > >