Have unlimited dreams.

S-lang is slang. S-lang for echo.

echoを作る

与えられた引数(文字列)を標準出力に書き出す。

C風

まずは、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のドキュメントより"()"の説明を見付ける事ができなかった。

forth風

()=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]