Colon: Concurrency
For hendelser i Colon har jeg bestemt meg for å bruke concurrency, ikke ulikt ifra Erlang. GUI-eksempler kommer jeg tilbake til senere når jeg har ting mer klart.
Concurrency i Colon bruker tegnet for currency ¤_ foran et ord eller en blokk _{} for å utføre dette i en egen concurrent prosess. I tillegg brukes ordene receive og send.
- sayhello: "Hello World!" out
- ¤sayhello
- -> Hello World!
- sayreceived: receive "Received @0" out
- 5 ¤sayreceived send
- -> Received 5
- saymulti: receive
- {ok} = ? "OK" out
- {warning _} = ? "Warning: @0" out
- saymulti
- ¤saymulti :pid
- # ...
- {warning "battery low"} pid send
- -> Warning: battery low
- ¤{"Hello World!" out}
- -> Hello World!
Et større eksempel
Her er et x^y concurrency eksempel fra Erlang jeg satt og lekte meg med og det ble som følger i Colon:
- pow: {N M} = ?
- {} {@self @M} powspawn | N swap send + ;
- 1 swap | drop receive *
- powspawn:
- {Pid 0} = ? {} ¤{receive 1 @Pid send} +
- {Pid M} = ?
- ¤{receive @Pid send}
- {@Pid @M 1 -} powspawn +
Hvorvidt dette er helt riktig vet jeg sannelig ikke, er ikke alltid like enkelt når ting er i endring å samtidig la hjernen leke både kompilator og VM på engang ;-)
Erlang:
- pow(N, M) ->
- Pids = pow_spawns(self(),M),
- Vals = lists:map(fun(P) -> P ! N end, Pids),
- lists:foldl(
- fun(_,Total) -> receive X -> X*Total end end,
- 1, Vals).
- pow_spawn(Pid,0) ->
- [spawn(fun() -> receive _ -> Pid ! 1 end end)];
- pow_spawn(Pid,M) ->
- [spawn(fun() -> receive X -> Pid ! X end end)
- | spawn(pow_span(Pid,M-1))].
Relevante innlegg/sider/lenker
| Innlegg: Sider: | På forsiden: |




0 tilbaketråkk: