JoCaml
From Wikipedia the free encyclopedia
This article has multiple issues. Please help improve it or discuss these issues on the talk page. (Learn how and when to remove these template messages)
|
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 a modified syntax and improved OCaml compatibility compared to the original.
JoCaml was used by team Camls 'R Us to implement a distributed ray tracer,[4] earning 2nd place on the ICFP 2000 programming contest.
The name is a reference to Joe Camel, a cartoon camel used in advertisements for Camel-brand cigarettes.
Example[edit]
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("Coffee") | 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 Coffee Tea Refund 5
See also[edit]
References[edit]
- ^ Qin Ma and Luc Maranget (2004). "Compiling Pattern-Matching in Join-Patterns". Proc. Of the 15th International Conference on Concurrency Theory. LNCS. 3170. Springer-Verlag.
- ^ Ma, Qin; Maranget, Luc (2008). "Algebraic Pattern Matching in Join Calculus". Logical Methods in Computer Science. 4 (1). arXiv:0802.4018. Bibcode:2008arXiv0802.4018M. doi:10.2168/LMCS-4(1:7)2008. S2CID 15873901.
- ^ Conchon, S.; Le Fessant, F. (1999). "Jocaml: Mobile agents for Objective-Caml". Proceedings. First and Third International Symposium on Agent Systems Applications, and Mobile Agents. pp. 22–29. doi:10.1109/ASAMA.1999.805390. ISBN 0-7695-0342-X. S2CID 14355301.
- ^ Louis Mandel; Luc Maranget. "Programming in JoCaml". Inria research report 6261.