Jump to content
Wikipedia The Free Encyclopedia

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 messages)
This article relies excessively on references to primary sources . Please improve this article by adding secondary or tertiary sources.
Find sources: "JoCaml" – news · newspapers · books · scholar · JSTOR
(May 2015) (Learn how and when to remove this message)
The topic of this article may not meet Wikipedia's general notability guideline . Please help to demonstrate the notability of the topic by citing reliable secondary sources that are independent of the topic and provide significant coverage of it beyond a mere trivial mention. If notability cannot be shown, the article is likely to be merged, redirected, or deleted.
Find sources: "JoCaml" – news · newspapers · books · scholar · JSTOR
(May 2015) (Learn how and when to remove this message)
(Learn how and when to remove this message)
JoCaml
Paradigms Multi-paradigm: functional, imperative
FamilyML: Caml: OCaml
Developer Inria
First appeared1999; 26 years ago (1999)
Stable release
4.01 / March 2014; 11 years ago (2014-03)
OS Cross-platform
License LGPL
Websitejocaml.inria.fr

JoCaml[1] [2] is an experimental general-purpose, high-level, multi-paradigm, functional and object-oriented 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

$ jocamlcexample.ml-otest
$ ./test
Coffee
Tea
Refund 5

See also

[edit ]

References

[edit ]
  1. ^ Ma, Qin; Maranget, Luc (2004). "Compiling Pattern-Matching in Join-Patterns". Proceedings 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 of the 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.
[edit ]
ML programming
Software
Implementations,
dialects
Caml
Standard ML
Dependent ML
Programming tools
Theorem provers,
proof assistants
Community
Designers
  • Lennart Augustsson (Lazy ML)
  • Damien Doligez (OCaml)
  • Gérard Huet (Caml)
  • Xavier Leroy (Caml, OCaml)
  • Robin Milner (ML)
  • Don Sannella (Extended ML)
  • Don Syme (F#)

  • Stub icon

    This programming-language-related article is a stub. You can help Wikipedia by expanding it.

    AltStyle によって変換されたページ (->オリジナル) /