2019/06/25

umeboshi色々試行錯誤

umeboshiにListを実装

umeboshiでは最初に2つの大きな壁がありました。変数とリストです。どうやって実装するのだろう?と試行錯誤した結果、変数に関しては何とか実装できました。しかしリストの機能は、中々良いアイデアが浮かばず、実装できずにいました。
しかし、前々回の記事でのヒラメキから急にアイデアが浮かび始め、今回とりあえず実装することができました。

機能はとりあえずfirstrestがあれば、色々できるだろうということで、これらを実装することにしました。firstはListの最初の要素を返します。restは残りの要素全部を返します。

umeboshiにIfを実装

どうしても欲しい機能として条件分岐がありました。更に関数を扱えるようにもしたいという欲も出て参りました。が、とりあえず何とかIf・then・else的なものを実装することにしました。その過程において、偶数か奇数かというような条件分岐の際に必要となるRemも実装することになりました。

問題発生

なんとかIf文が扱えるようになりましたが、ここで問題が発生します。例えば以下のような場合

umeboshi>> (if (eq 1 1) (print Equal) (print Not Equal))
エラーになります。printの部分の処理がめちゃくちゃ下手くそでした。処理の流れは以下のようになっていました。

1.  stack: Token::Str("Equal")
2.  stack: Token::Str("Equal"), Token::Str("Not")
3.  print
4.  stack: Token::Str("Not Equal")
5.  stack: Token::Str("Not Equal"), Token::Str("Equal")
6.  print
7.  stack: Token::Str("Equal Not Equal") どっちやねん!
8.  stack: Token::Str("Equal Not Equal"), Token::Num(1), Token::Num(1)
9.  eq
10. stack: Token::Str("Equal Not Equal"), Token::Bool(true)
11. if

つまり、Ifのところに来る前にすでにおかしなことになっておる。ということで、何かよい案が浮かぶまで、printを無いものとしました。
とりあえず文字列というものを何とか導入する方向で考えていこうかと思います。道は険しい……