![]() | This article has multiple issues. Please helpimprove it or discuss these issues on thetalk page.(Learn how and when to remove these messages) (Learn how and when to remove this message)
|
Paradigms | Multi-paradigm:functional,imperative |
---|---|
Family | ML:Caml:OCaml |
Developer | Inria |
First appeared | 1999; 26 years ago (1999) |
Stable release | 4.01 / March 2014; 11 years ago (2014-03) |
OS | Cross-platform |
License | LGPL |
Website | jocaml |
JoCaml[1][2] is an experimentalgeneral-purpose,high-level,multi-paradigm,functional andobject-orientedprogramming language derived fromOCaml. It integrates the primitives of thejoin-calculus to enable flexible,type-checkedconcurrent anddistributed 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 distributedray tracer,[4] earning 2nd place on the ICFP 2000 programming contest.
The name is a reference toJoe Camel, a cartooncamel used in advertisements forCamel-brand cigarettes.
typecoins=Nickel|Dimeanddrinks=Coffee|Teaandbuttons=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). *)defput(s)=print_endlines;0(* STOP *);;(* put: string Join.chan *)defgive(d)=matchdwithCoffee->put("Coffee")|Tea->put("Tea");;(* give: drink Join.chan *)defrefund(v)=lets=Printf.sprintf"Refund %d"vinput(s);;(* refund: int Join.chan *)letnew_vendinggiverefund=letvend(cost:int)(credit:int)=ifcredit>=costthen(true,credit-cost)else(false,credit)indefcoin(Nickel)&value(v)=value(v+5)&replytocoinorcoin(Dime)&value(v)=value(v+10)&replytocoinorbutton(BCoffee)&value(v)=letshould_give,remainder=vend10vin(ifshould_givethengive(Coffee)else0(* STOP *))&value(remainder)&replytobuttonorbutton(BTea)&value(v)=letshould_give,remainder=vend5vin(ifshould_givethengive(Tea)else0(* STOP *))&value(remainder)&replytobuttonorbutton(BCancel)&value(v)=refund(v)&value(0)&replytobuttoninspawnvalue(0);coin,button(* coin, button: int -> unit *);;(* new_vending: drink Join.chan -> int Join.chan -> (int->unit)*(int->unit) *)letccoin,cbutton=new_vendinggiverefundinccoin(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
$jocamlcexample.ml-otest$./testCoffeeTeaRefund 5
![]() | Thisprogramming-language-related article is astub. You can help Wikipedia byexpanding it. |