erlang書いてみた。

プログラミング言語Erlang入門

プログラミング言語Erlang入門

サンプルのコードで、リストを引数にして引き回すのがいやだったので適当に書いてみた。

-module(fib).
-export([fib/1, fib/2, cfib/1]).

fib (0) -> 1;
fib (1) -> 1;
fib (N) -> fib(N - 1) + fib(N - 2).

fib (N, P) -> P ! fib(N).

cfib (N) -> 
    S = self(),
    spawn(fib, fib, [N - 1, S]),
    spawn(fib, fib, [N - 2, S]),
    nrecv_sum(2).

nrecv_fold (I, _, 0) -> I;
nrecv_fold (I, F, N) -> 
    receive
        R -> F(R, nrecv_fold(I, F, N - 1))
    end.
    
nrecv_sum(N) -> nrecv_fold(0, fun(A, B) -> A + B end, N).

外から見えなくても良い関数をexportしないといけないのが萎え
あと、シェルでは関数定義とかできないのかな?
fun を使っても良いのかもしれないけれど。