同じく、たなかさんのねた: 逆ポーランド電卓
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