Ur也叫作Ur/Web,是一个自由和开源的函数式编程语言,专门用于web开发,由Adam Chlipala在麻省理工学院创建,它从一个单一的程序产生服务器代码、web浏览器客户端代码、和特定于选择的数据库后端的SQL代码。
概述
Ur的语法基于了Standard ML,然而语言也包括来自Haskell的概念,具有额外的类型操纵。Ur支持一种基于行类型的强力的元编程,有着勾画每个构件的额外注释:
接口文件(类似ML的签名)具有.urs扩展名:
( 环境单子叫做transaction,对应于Haskell的IO单子 )
val main : unit -> transaction page
实现文件(.ur扩展名):
datatype list t = Nil | Cons of t * list t
table t : { Id : int, A : string }
PRIMARY KEY Id
(* 服务器端数据库访问,通过AJAX XmlHttpRequest调用,
封装为rpc函数(远程过程调用) *)
fun add id s =
( sql dml模板,据有表达式{[expression]} )
dml (INSERT INTO t (Id, A) VALUES ({[id]}, {[s]}))
fun del id =
dml (DELETE FROM t WHERE t.Id = {[id]})
fun lookup id =
( haskell风格单子代码 )
ro return None ( return是单子提升函数 )
| Some r => return (Some r.T.A)
(* check由客户端onClick事件处理器调用,
所以它将被编译成JavaScript,成为嵌入了客户端脚本的页面 *)
fun check ls =
case ls of
Nil => return ()
| Cons (id, ls') =>
ao "Nada"
| Some a => a
);
check ls'
fun main () =
idAdd
let val mylist = 1 :: 2 :: 3 :: []
in
check mylist
end
}/>
id
id
项目文件(.urp扩展名),必须包含可选的指令(directive)列表,跟随着项目模块的列表:
# hash号前缀于行注释
rewrite url Module1/main # 设置根URL至Module1/main函数
exe myexename
database dbname=test # 数据库特性和参数
sql noisy.sql
$/list # stdlib模块前缀着"$/"
module2 # 如果被module1所用则必须前导于它
module1 # main模块
- 服务器端,没有副作用的检索函数的页面(HTTPGET方法),经由一个URL而可访问为/ModulePath/functionName,它们应当具有类型(unit -> transaction page)。
- 要导出可能导致副作用的一个页面,只能通过HTTPPOST方法来访问,包括指定页面处理器的一个实际参数,它具有类型Basis.postBody。
编译:
urweb module1 # 查找module1.urp
作为一个web服务器来执行(其他模态有CGI、FastCGI等等):
./module1.exe -p 8081 # -h : RTS选项帮助
引用
外部链接
- [http://impredicative.com/ur Ur language home page]
- [https://github.com/urweb/urweb Ur/Web project page on GitHub]
- [http://www.impredicative.com/wiki/index.php/Special:AllPages Ur wiki]
评论 (0)