フォロー頂いた事項を試してみた

モチ切れ状態、と威張っていても仕方ないので rui314 さんにフォロー頂いたソレを試してみた。ぢつは eunit の動かし方が微妙で (を
フォロー頂いた事項を盛り込んでみたのが以下。(tut0.erl)

-module(tut0).
-export([test/2]).
-export([run_test/0]).

test(_, 0) ->
    1;
test(X, Y) when Y rem 2 == 0 ->
    S = fun(N) -> N * N end,
    S(test(X, Y div 2));
test(X, Y) ->
    X * test(X, Y - 1).

run_test() ->
    1 = tut0:test(2, 0),
    2 = tut0:test(2, 1),
    256 = tut0:test(2, 8),
    io:format(" TEST OK~n").

# 実装微妙ですがご勘弁下さひ。

で、まず erl なソレで確認 (実はいくつか不備があって動かなかったのですが、その経緯というか試行錯誤は略

$ erl
Erlang (BEAM) emulator version 5.5.2 [source] [async-threads:0] [kernel-poll:false]

Eshell V5.5.2  (abort with ^G)
1> c(tut0).
{ok,tut0}
2> tut0:run_test().
 TEST OK
ok
3> 
BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
       (v)ersion (k)ill (D)b-tables (d)istribution
a
$

動いたんでご教示頂いたコマンドを試してみた。

$ erl +K true -noshell -s tut0 run_test -s init stop
 TEST OK
$

をー、と言いつつ特にコマンドオプションで何を指定しているのか不明 (特に最後のソレが一番微妙)。ドキュメント類に目を通してチェキ入れてみます。(とほほほ

追記

コメントへのリプライは別途として、試験が失敗したソレを試すのを忘れてた。

-module(tut0).
-export([test/2]).
-export([run_test/0]).

test(_, 0) ->
    1;
test(X, Y) when Y rem 2 == 0 ->
    S = fun(N) -> N * N end,
    S(test(X, Y div 2));
test(X, Y) ->
    X * test(X, Y - 1).

run_test() ->
    1 = tut0:test(2, 1),
    2 = tut0:test(2, 1),
    256 = tut0:test(2, 8),
    io:format(" TEST OK~n").

当たり前ですが試験はパスしません (2 の 1 乗は 2)。これを試験するとどうなるか。最初はコンパイルせずに試験を動かしてパスしてました。コマンドラインからのコンパイルは別途確認として、erl でコンパイルした後にコマンドラインから実行したソレが以下。

$ erl +K true -noshell -s tut0 run_test -s init stop
{"init terminating in do_boot",{{badmatch,2},[{tut0,run_test,0},{init,start_it,1},{init,start_em,1}]}}

Crash dump was written to: erl_crash.dump
init terminating in do_boot ()
$

rui314 さんから頂いたナニによる -s init stop を略して、な実行をためしてみたいんですが、もう限界。別途確認してみます。どうもありがとうございました。> rui314 さん

追記

む。これってコンパイルなソレが略されてるような気が。(気のせいッスか?