[Ur] Looking for a minimal example using source / signal - eg, User types into a textbox, changes appear below in an <xml> fragment

Stefan Scott Alexander stefanscottalexx at gmail.com
Thu Aug 13 23:38:50 EDT 2015


I'm trying to do a very minimal example to get started using source /
signal - based on some existing examples.

(1) Existing example:

I'm getting guidance from an existing example called cselect.ur:

  https://github.com/urweb/urweb/blob/master/tests/cselect.ur

fun main () =
    s <- source "";
    return <xml><body>
      <cselect source={s} onchange={v <- get s; alert ("Now it's " ^ v)}>
        <coption>Wilbur</coption>
        <coption>Walbur</coption>
      </cselect>

      Hello, I'm <dyn signal={s <- signal s; return <xml>{[s]}</xml>}/>.
      I'll be your waiter for this evening.
    </body></xml>


(2) Another existing example - the 'increment' demo:

  http://www.impredicative.com/ur/demo/increment.html


(3) Initial coding attempt:

I thought I could just make some minor modifications, to change the
<cselect> in (1) to a <textbox>, as follows:

fun main () =
    s <- source "";
    return <xml><body>
      <textbox source={s} onchange={v <- get s; alert ("Now it's " ^ v)}>
      </textbox>

      Hello, I'm <dyn signal={s <- signal s; return <xml>{[s]}</xml>}/>.
    </body></xml>

However, this is giving lots of compile errors.

I don't understand the correct way to connect the source and the signal
together, along with the controls on the page, plus the code inside the
curly brackets { } .


(4) Ultimately, what I want to develop is:

(a) a <textbox> on the client, called `txbx`, which the user can change by
typing

(b) a table `t` on the server, which will be "live-queryable" using the
<textbox>:

(c) when user types something different in the <textbox>, there is an <xml>
fragment below the <textbox> which instantly changes:

eg - the <xml> fragment might be something like this:

  return queryX1 (SELECT Nam FROM t WHERE Nam LIKE '*' ^ {[txbx]} '*')
                 (fn r => <xml>{[r.Nam]}<br/></xml>);

I can't even get the simpler case (3) above to work. After I get (3) to
work, then I can try (4).


(5) Possibly elated work from 1998:

Version 2.0 of a high-performance applicative / impredicative / functional
columnar database called K from kx.com had a GUI which implemented
something called "triggers" and "dependencies", similar to "sources" and
"signals".

The manual can still be read, via archive.org:


http://web.archive.org/web/20050504070651/http://www.kx.com/technical/documents/kreflite.pdf

Pages 35, 45 and 14 describe "dependencies" and "triggers" as used in the
GUI:

  https://github.com/kevinlawler/kona/issues/304

The syntax in K was a bit more limited than Ur/Web's:

Dependency:

  v..d: "b + c"

means:

  if b or c changes, then update v to equal b + c


Trigger:

  x..t: "pid 3: (`b; 0; :; x)"

means:

  if x changes, then execute "pid 3: (`b; 0; :; x)"

I think Ur/Web's source and signal syntax is more general than the syntax
for dependencies and triggers in K from kx.com. However it can be
interesting to compare this historical example of "dataflow". Meanwhile,
due to the greater flexibility of Ur/Web's syntax, the programmer needs to
take more care to correctly "wire" the pieces together.

This is where I'm getting confused - the "dataflow wiring" in minimal
example (3) above!


Thanks for any help!

###
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.impredicative.com/pipermail/ur/attachments/20150814/dc7c5cdf/attachment.html>


More information about the Ur mailing list