A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://en.wikipedia.org/wiki/JoCaml below:

JoCaml - Wikipedia

Toggle the table of contents JoCaml

From Wikipedia, the free encyclopedia

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.

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

RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4