JoCaml
Lua error in package.lua at line 80: module 'strict' not found.
Developer(s) | INRIA |
---|---|
Stable release | 4.01 / March 2014 |
Operating system | Cross-platform |
Type | Programming language |
License | LGPL |
Website | http://jocaml.inria.fr/ |
JoCaml[1][2] is an experimental functional programming language derived from OCaml. It integrates the primitives of the join-calculus to enable flexible, type-checked concurrent and distributed programming. The current version of JoCaml is a re-implementation of the now unmaintained JoCaml[3] made by Fabrice Le Fessant, featuring an modified syntax and improved OCalm compatibility compared to the original.
JoCalm was used by team Camls 'R Us to implement a distributed ray tracer,[4] earning 2nd place on the ICFP 2000 programming contest.
Contents
Example
type coins = Nickel | Dime
and drinks = Coffee | Tea
and buttons = BCoffee | BTea | BCancel;;
(* def defines a Join-pattern alternatives set clause
* '&' in the left side of '=' means join (channel synchronism)
* '&' in the right hand side is parallel processing
* synchronous_reply :== "reply" [x] "to" channel_name
* synchronous channels have function-like types (`a -> `b)
* while asynchronous ones have type `a Join.chan
* only the last statement in a pattern rhs expression can be an asynchronous message
* 0 in an asynchronous message position means STOP ("no sent message" in CSP terminology).
*)
def put(s) = print_endline s ; 0 (* STOP *)
;; (* put: string Join.chan *)
def give(d) = match d with
Coffee -> put("Cofee")
| Tea -> put("Tea")
;; (* give: drink Join.chan *)
def refund(v) = let s = Printf.sprintf "Refund %d" v in put(s)
;; (* refund: int Join.chan *)
let new_vending give refund =
let vend (cost:int) (credit:int) = if credit >= cost
then (true, credit - cost)
else (false, credit)
in
def coin(Nickel) & value(v) = value(v+5) & reply to coin
or coin(Dime) & value(v) = value(v+10) & reply to coin
or button(BCoffee) & value(v) =
let should_give, remainder = vend 10 v in
(if should_give then give(Coffee) else 0 (* STOP *))
& value(remainder) & reply to button
or button(BTea) & value(v) =
let should_give, remainder = vend 5 v in
(if should_give then give(Tea) else 0 (* STOP *))
& value(remainder) & reply to button
or button(BCancel) & value(v) = refund( v) & value(0) & reply to button
in spawn value(0) ;
coin, button (* coin, button: int -> unit *)
;; (* new_vending: drink Join.chan -> int Join.chan -> (int->unit)*(int->unit) *)
let ccoin, cbutton = new_vending give refund in
ccoin(Nickel); ccoin(Nickel); ccoin(Dime);
Unix.sleep(1); cbutton(BCoffee);
Unix.sleep(1); cbutton(BTea);
Unix.sleep(1); cbutton(BCancel);
Unix.sleep(1) (* let the last message show up *)
;;
execution
$ jocamlc example.ml -o test $ ./test Cofee Tea Refund 5
See also
References
<templatestyles src="Reflist/styles.css" />
Cite error: Invalid <references>
tag; parameter "group" is allowed only.
<references />
, or <references group="..." />
External links
<templatestyles src="Asbox/styles.css"></templatestyles>