Jump to content

Ur (programming language)

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Griba2010 (talk | contribs) at 10:49, 5 January 2015 (New). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
(diff) ← Previous revision | Latest revision (diff) | Newer revision → (diff)

Ur also called Ur/Web is an open source functional programming language specific for web development, created by Adam Chlipala at the Massachusetts Institute of Technology[1] that from a single program produces server code, browser client code and SQL code specific for the database backend.

Forms structure and server handler ones are typechecked at compile time to ensure an unmatched web quality.

An Object relational mapping based on records is embedded in the language through the SQL language extension.

Although the syntax is based on Standard ML the language includes concepts from Haskell with additional type manipulation.

This is an example demo program showing client, server and database code with Ajax communication encapsulated in the rpc function call:

datatype list t = Nil | Cons of t * list t

table t : { Id : int, A : string }
  PRIMARY KEY Id

fun add id s =
    dml (INSERT INTO t (Id, A) VALUES ({[id]}, {[s]}))

fun del id =
    dml (DELETE FROM t WHERE t.Id = {[id]})

fun lookup id =
    ro <- oneOrNoRows (SELECT t.A FROM t WHERE t.Id = {[id]});
    case ro of
        None => return None
      | Some r => return (Some r.T.A)

fun check ls =
    case ls of
        Nil => return ()
      | Cons (id, ls') =>
        ao <- rpc (lookup id);
        alert (case ao of
                   None => "Nada"
                 | Some a => a);
        check ls'

fun main () =
    idAdd <- source "";
    aAdd <- source "";

    idDel <- source "";

    return <xml><body>
      <button value="Check values of 1, 2, and 3" onclick={fn _ => check (Cons (1, Cons (2, Cons (3, Nil))))}/><br/>
      <br/>
      <button value="Add" onclick={fn _ => id <- get idAdd; a <- get aAdd; rpc (add (readError id) a)}/>
      <ctextbox source={idAdd}/>
      <ctextbox source={aAdd}/><br/>
      <br/>
      <button value="Delete" onclick={fn _ => id <- get idDel; rpc (del (readError id))}/>
      <ctextbox source={idDel}/>
    </body></xml>

References