Have unlimited dreams.
与えられた引数(文字列)を標準出力に書き出す。
まずは、C風
% jed -script ./script-file [arg] ..... variable i = 3; while (i < __argc) { ()=printf("%s ", __argv[i]); i++; } () = printf("\n");
しかし、"()=printf(....)"の"()"てなんだろうという、疑問がわく。
S-langは、引数も、戻り値も、スタック経由で処理される。 明示的に処理しないと、引数や戻り値は、スタックに残る。 printfは、数値1つを戻すので、これを"()=..."で破棄している。
ここでの左辺の"()"は、forthでいうdropである。 s-langでは、スタックを破棄するためにpopという関数が用意されている。
スタックの状態は、__debug_infoと_print_stackで確認できる。
% jed -script script-file [arg] ..... _debug_info = 1; ()=printf("start\n"); printf("1\n"); _print_stack (); printf("22\n"); _print_stack ();
"()"であれば、スタックから一つとりだすが、"(a, b)"では、2つ、 "(a, b, c)"では、3つ、以下同様。いくつでも取り出せる。 このように、左辺の"(....)"を使用して、いくつかの変数に代入できる。
(x, y) = (1, 2);
左辺があれば右辺もある。右辺の"()"はスタックトップを示す。 "i=i+1"を"()"を使用して表す。
1; i; i = () + ();
補足:残念ながらS-langのドキュメントより"()"の説明を見付ける事ができなかった。
()=printf("%s ", __argv[i])をforth風にする。
% jed -script ./script-file [arg] ..... variable i = 3; while (i < __argc) { _argv[i]; "%s "; printf(); pop(); i++; } () = printf("\n");
無保証
motto: みんなに感謝,あなたに感謝 (next:為に生きる Rev.S.M.ムーン)
I am grateful to everyone and you.
mizotec@nifty.com [up]