インタプリタを作った

また、遊びでインタプリタを作ってみた。文法はまるで英語の文章のような感じにしたかったんだけど、いまいち。なんとなくプログラムを公開してもいないのに、文法の解説してみる。

階乗をを求めるコードは以下の通り。

#!/home/jklein/dev/sproject/talkc/talkc

一番目の引数の階乗を出力する。


 ( (変数の宣言) )
 result and n is int.
 result = 0.

 ( (引数があれば階乗を求める) )
 do this if $@ is greater than 1.
 -----
    result = n = $1.
    do result = result * (n = n - 1) while n is greater than 1.
 -----

 ( (出力) )
 execute /bin/echo with "result :", result.

まず、ファイルの先頭部分("====="があるところまで)は自由スペース。二重括弧の中がコメント。ループはwhile文のみ、条件分岐はif文のみだけど、ムダに自由度が高い。ちなみに途中にある"-----"はブロックの開始と終了を意味する(Cでいうブレース)。基本的なif文の書き方は次の通り

 do this if XX equals 10.
 -----
    vlaue = 10.
 -----

だけど、キーワードthisの代わりに、文を書いても良いので

 do value = 10 if XX equals 10.

でもOK。同じようにwhileも2通り書ける。

 do this while XX equals 10.
 -----
    value = value + 1.
 -----

do value = value + 1 while XX equals 10.

で、変数宣言は次のように書く(型は文字列とintのみ)。

value is int.
i and res is int.
XX is string.

シェルのコマンドを呼ぶときは

execute /bin/echo with "arg1", "arg2".

もちろん、コマンドの引数に式を渡すこともできる。文字列同士の接続、文字列と数の接続は算術コードの加算でできる。さらに必要なタイミングで数に自動的に変換される。

hoge is string.
num is int.

hoge = "foo".
hoge = hoge + 2. ( ( hogeは"foo2"になる ) )
hoge = hoge + "bar". ( (hogeは"foo2bar"になる) )

hoge = "12". ( (hogeは文字列"12"になる) )
num = hoge. ( (numは数の12になる) )


もの凄い、読みづらい(苦笑)。if-elseの連続は以下のようになる。

do value = 1 if XX equals 10.
or do value = 2 if XX equals 12.
or do this if XX is less than 0.
        • -
...
      • -
or do [ execute /bin/echo "error"].

読みづらい…。実用したくないな。


:追記:はてなでは二重括弧が註釈に解釈されてしまうので、括弧のあいだにスペースをいれた。