JoCaml

JoCaml
Developer(s)INRIA
Stable release
4.01 / March 2014
Operating systemCross-platform
TypeProgramming language
LicenseLGPL
Websitehttp://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]

  1. ^ 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.
  2. ^ 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.
  3. ^ 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.
  4. ^ Louis Mandel; Luc Maranget. "Programming in JoCaml". Inria research report 6261.

External links[edit]