インタプリタを作った
また、遊びでインタプリタを作ってみた。文法はまるで英語の文章のような感じにしたかったんだけど、いまいち。なんとなくプログラムを公開してもいないのに、文法の解説してみる。
階乗をを求めるコードは以下の通り。
#!/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.
-
-
-
- -
-
-
-
-
- -
-
読みづらい…。実用したくないな。
:追記:はてなでは二重括弧が註釈に解釈されてしまうので、括弧のあいだにスペースをいれた。