Erlang勉強会に向けて予習的な
Erlang 分散システム勉強会に参加するので予習
とりあえずproject euler 10を書いてみた。
-module(project_euler). -export([is_prime/1, is_prime/2]). -export([add/2]). -export([loop/2, loop/3]). %% check the prime number method. %% arg: <integer> N is_prime(N) -> M = 3, if N < 2 -> false; N == 2 -> true; N == 3 -> true; N rem 2 =:= 0 -> false; true -> is_prime(N, M) end. is_prime(N, M) -> if N rem M =:= 0 -> false; M * M =< N -> is_prime(N, M+2); true -> true end. add(N, M) -> N + M. loop(N, M) -> loop(N, M, 0). loop(N, M, Sum) when N > M -> Sum; loop(N, M, Sum) -> case is_prime(N) of true -> loop(N+1, M, add(N, Sum)); false -> loop(N+1, M, add(0, Sum)) end.
$ erlc project_euler.erl $ ls project_euler.erl project_euler.beam $ erl -eval 'io:format("~s", [project_euler:loop(1,2000000)])' -noshell -s init stop {"init terminating in do_boot",{badarg,[{io,format,[<0.23.0>,"~s",[142913828922]]},{erl_eval,do_apply,5},{init,start_it,1},{init,start_em,1}]}} Crash dump was written to: erl_crash.dump init terminating in do_boot ()
あれー。結果は取り出せたのにエラーが。。。
しかもおっそいし!
c++のが全然早いじゃん。。。
書き方が悪いんだろうけどよくわかんないなー。
erlシェルからも実行してみる
$ erl Erlang R13B03 (erts-5.7.4) [source] [64-bit] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false] Eshell V5.7.4 (abort with ^G) 1> project_euler:loop(1,2000000). 142913828922
エラーは出ないけどおっそい!!!
絶対書き方だよなぁ。。。
あと-noshellで実行したときにエラー出る原因がわからん。
- [追記]
io:formatに結果渡す時にintegerからlistに変換しないといけなかったみたい。
$ erl -eval 'X=project_euler:loop(1,2000000),io:format("~s~n", [integer_to_list(X)])' -noshell -s init stop 142913828922