逆ポーランド電卓
新しい言語を学ぶ時には必ず作る逆ポーランド電卓です。エラーチェックはありません。エラーチェックを追加する元気がありませんでした。
ファイル: rpcalc.erl
-module(rpcalc). -export([rpcalc/2, main/1]). rpcalc([Ans | []], []) -> Ans; rpcalc(Stack, ["+" | Ss]) -> rpcalc(op_plus(Stack), Ss); rpcalc(Stack, ["-" | Ss]) -> rpcalc(op_minus(Stack), Ss); rpcalc(Stack, ["*" | Ss]) -> rpcalc(op_mult(Stack), Ss); rpcalc(Stack, ["/" | Ss]) -> rpcalc(op_div(Stack), Ss); rpcalc(Stack, [S | Ss]) -> rpcalc(push(Stack, S), Ss). push(Stack, S) -> [element(1, string:to_integer(S)) | Stack]. op_plus ([A, B | Stack]) -> [B + A | Stack]. op_minus([A, B | Stack]) -> [B - A | Stack]. op_mult ([A, B | Stack]) -> [B * A | Stack]. op_div ([A, B | Stack]) -> [B div A | Stack]. main(Args) -> Ss = lists:append(lists:map(fun(A) -> string:tokens(A, " ") end, Args)), Ans = rpcalc([], Ss), io:format("~.10B~n", [Ans]).
実行例:
$ escript rpcalc.erl "1 2 + 4 * 2 /" 6
んー、やっぱり静的型欲しいなぁ。Haskellが恋しいです。
参照: 逆ポーランド電卓をつくってみました - 趣味的にっき