% % Declarative Concurrency % % creating threads declare proc {Loop P N} if N > 0 then {P} {Loop P N-1} else skip end end thread {Loop proc {$} {Browse 1} end 1000} end thread {Loop proc {$} {Browse 2} end 1000} end % dataflow variables declare X {Browse X} local Y in thread {Delay 1000} Y = 10*10 end X = Y + 100*100 end declare X0 X1 X2 X3 {Browse [X0 X1 X2 X3]} thread Y0 Y1 Y2 Y3 in {Browse [Y0 Y1 Y2 Y3]} Y0 = X0 + 1 Y1 = X1 + Y0 Y2 = X2 + Y1 Y3 = X3 + Y2 {Browse completed} end X0 = 1 X1 = 2 X2 = 3 X3 = 4 % concurrent map declare fun {Map Xs F} case Xs of nil then nil [] X|Xr then thread {F X} end|{Map Xr F} end end declare F X Y Z {Browse thread {Map X F} end} X = 1|2|Y fun {F X} X*X end Y = 3|Z Z = nil % concurrent fibonacci declare fun {Fib X} if X=<2 then 1 else thread {Fib X-1} end + {Fib X-2} end end {Browse {Fib 6}} {Browse {Fib 20}} {Browse {Fib 26}} {Browse {Fib 27}} % streams declare fun {Generate N Limit} if N=