[Top Page][Discussion][Edit History][All Pages][Recent Changes][->Japanese]

Erlang/2005/09/07/reverse-polish-notation-calculator

Category of Erlang

同じく、たなかさんのねた: 逆ポーランド電卓

Schemeで書く場合でも、副作用を用いないで書くように心掛ければ、 リスト処理のよい練習になるのではないでしょうか。

勉強のために作っていらっしゃるそうなので、 邪魔をしないようにerlangで。

$ cat rpcalc.erl
-module(rpcalc).
-export([rpcalc/1]).

op (X, M, N) ->
    case X of
        '+' -> M + N;
        '-' -> M - N;
        '*' -> M * N;
        '/' -> M / N;
        _   -> unknown
    end.

rpcalc ([], N, S) when is_number(N) ->
    [N | S];
rpcalc ([], X, [M, N | S]) ->
    [op(X, N, M) | S];

rpcalc ([H | T], N, S) when is_number(N)->
    rpcalc(T, H, [N | S]);
rpcalc ([H | T], X, [M, N | S]) ->
    rpcalc(T, H, [op(X, N, M) | S]).

rpcalc ([H | T]) ->
    rpcalc(T, H, []).

$ erl
1> c(rpcalc).
{ok,rpcalc}
2> io:fwrite("~w~n", rpcalc:rpcalc([2, 3, '*', 4, 5, '+', '*'])).
54
ok

パターンマッチ万歳。

blog comments powered by Disqus