JoCaml [1] [2] — экспериментальный высокоуровневый , многопарадигмальный , функциональный и объектно-ориентированный язык программирования общего назначения, производный от OCaml . Он объединяет примитивы исчисления соединений, чтобы обеспечить гибкое параллельное и распределенное программирование с проверкой типов . Текущая версия JoCaml представляет собой повторную реализацию уже не поддерживаемого JoCaml [3] , созданного Фабрисом Ле Фессантом, с измененным синтаксисом и улучшенной совместимостью с OCaml по сравнению с оригиналом.
JoCaml использовался командой Camls 'R Us для реализации распределенной трассировки лучей , [4] заработав 2-е место на конкурсе программистов ICFP 2000.
Название является отсылкой к Джо Кэмелу , мультяшному верблюду , который использовался в рекламе сигарет марки Camel .
тип монеты = Никель | Десять центов и напитки = Кофе | Чай и пуговицы = BCoffee | BTea | BОтмена ;; (* def определяет предложение набора альтернатив шаблона соединения * '&' в левой части '=' означает соединение (синхронизация каналов) * '&' в правой части означает параллельную обработку * synchronous_reply :== "reply" [ x] "to" имя_канала * синхронные каналы имеют функциональные типы (`a -> `b) * асинхронные имеют тип `a Join.chan * только последний оператор в шаблонном выражении rhs может быть асинхронным сообщением * 0 в позиции асинхронного сообщения означает STOP («сообщение не отправлено» в терминологии CSP * ). def put ( s ) = print_endline s ; 0 (*СТОП*) ;; (* вставьте: строка Join.chan *) def Give ( d ) = сопоставить d с Coffee -> put ( «Кофе» ) | Чай -> поставить ( "Чай " ;; (*дайте: выпить Join.chan *) def return ( v ) = let s = Printf . sprintf "Возврат %d" v in put ( s ) ;; (*возврат: int Join.chan *) let new_vending дать возврат = let vend ( стоимость : int ) ( кредит : int ) = если кредит >= стоимость , то ( истина , кредит - стоимость ) иначе ( ложь , кредит ) в монете def ( никель ) & value ( v ) = стоимость ( v + 5 ) & ответ на монету или монету ( Dime ) & значение ( v ) = значение ( v + 10 ) и ответ на монету или кнопка ( BCoffee ) & значение ( v ) = let must_give , остаток = продать 10 v in ( если must_give тогда дать ( Coffee ) else 0 (* STOP *) ) & value ( остаток ) и ответить на кнопку или кнопка ( BTea ) & значение ( v ) = let must_give , остаток = vend 5 v in ( если must_give тогда дайте ( Tea ) else 0 (* STOP *) ) & value ( остаток ) и ответ на кнопку или кнопка ( BCancel ) и значение ( v ) = возврат ( v ) и значение ( 0 ) и ответ на кнопку в значении появления ( 0 ) ; coin , button (* coin, button: int -> unit *) ;; (* new_vending: Drink Join.chan -> int Join.chan -> (int->unit)*(int->unit) *) пусть ccoin , cbutton = new_vending вернут деньги в ccoin ( никель ); ccoin ( никель ); ccoin ( Дайм ); Юникс . спать ( 1 ); кнопка ( BCoffee ); Юникс . спать ( 1 ); cкнопка ( BTea ); Юникс . спать ( 1 ); кнопка c ( BCCancel ); Юникс . Sleep ( 1 ) (* пусть появится последнее сообщение *) ;;
исполнение
$ jocamlc example.ml -o test $ ./test Кофе Чай Возврат 5