exception name. The coordination system wires boxes in a dataflow programming style. The expression language is Haskell-like. The message passing concurrency system remembers JoCaml's Join patterns or Polyphonic C Sharp chords, but with all channels asynchronous. There is a scheduler built-in that continuously checks pattern-matching through all boxes in turn, putting on hold the boxes that cannot copy outputs to busy input destinations. Examples Vending machine data Coins = Nickel | Dime | Fake; data Drinks = Coffee | Tea; data Buttons = BCoffee | BTea | BCancel; type Int = int 32 ; exception EFakeCoin :: (Int, string) ; show v = v as string ; box coffee in ( coin :: Coins, button :: Buttons, value :: Int ) -- input channels out ( drink_outp :: string, value’ :: Int , refund_outp :: string, display :: string) -- named outputs within 500KB (400B) -- max heap ( max stack) cost bounding handles EFakeCoin, TimeOut, HeapOverflow, StackOverflow match -- * wildcards for unfilled outputs, and unconsumed inputs ( my_coin, *, v) {- ''join-pattern'' equivalent: coin(my_coin) & value(v) -} -> let v’ = incrementCredit my_coin v in ( *, v’, *, show v’) -- time bounding (''within x time-unit'') raises TimeOut () | ( *, BCoffee, v) {- ''join-pattern'' equivalent: button(BCoffee) & value(v) -} -> (vend Coffee 10 v) within 30s | ( *, BTea, v) -> (vend Tea 5 v) within 30s | ( *, BCancel, v) -> let refund u = "Refund " ++ show u ++ "\n" in ( *, 0, refund v, *) handle EFakeCoin (v, msg) -> ( *, v , *, msg) | TimeOut () -> (*, *, *, "maybe content exhausted, call service!") | HeapOverflow () -> (*, *, *, "error: heap limit exceeded") | StackOverflow () -> (*, *, *, "error: stack limit exceeded") ; incrementCredit coin v = case coin of Nickel -> v + 5 Dime -> v + 10 Fake -> raise EFakeCoin (v, "coin rejected") ; vend drink cost v = if v >= cost then ( serve drink, v - cost, *, "your drink") else ( *, v, *, "money is short of " ++ show (cost - v)) ; serve drink = case drink of Coffee -> "Coffee\n" Tea -> "Tea\n" ; box control in (c :: char) out (coin :: Coins, button:: Buttons) match 'n' -> (Nickel, *) | 'd' -> (Dime, *) | 'f'