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.

  1. sayhello: "Hello World!" out
  2. ¤sayhello
  3. -> Hello World!
  4. sayreceived: receive "Received @0" out
  5. 5 ¤sayreceived send
  6. -> Received 5
  7. saymulti: receive
  8. {ok} = ? "OK" out
  9. {warning _} = ? "Warning: @0" out
  10. saymulti
  11. ¤saymulti :pid
  12. # ...
  13. {warning "battery low"} pid send
  14. -> Warning: battery low
  15. ¤{"Hello World!" out}
  16. -> 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:

  1. pow: {N M} = ?
  2. {} {@self @M} powspawn | N swap send + ;
  3. 1 swap | drop receive *
  4. powspawn:
  5. {Pid 0} = ? {} ¤{receive 1 @Pid send} +
  6. {Pid M} = ?
  7. ¤{receive @Pid send}
  8. {@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:

  1. pow(N, M) ->
  2. Pids = pow_spawns(self(),M),
  3. Vals = lists:map(fun(P) -> P ! N end, Pids),
  4. lists:foldl(
  5. fun(_,Total) -> receive X -> X*Total end end,
  6. 1, Vals).
  7. pow_spawn(Pid,0) ->
  8. [spawn(fun() -> receive _ -> Pid ! 1 end end)];
  9. pow_spawn(Pid,M) ->
  10. [spawn(fun() -> receive X -> Pid ! X end end)
  11. | spawn(pow_span(Pid,M-1))].

Tilbaketråkk url: klikk her!
Stikkord: colon
Fb

Relevante innlegg/sider/lenker

0 tilbaketråkk: