LoginSignup
2
0

More than 1 year has passed since last update.

orelangのdart版を作って拡張しました

Posted at

なんだこれは

みなさんはorelangを知ってますか?
プログラミング言語を作る。1時間で。という素晴らしい記事で実際に作られている言語です。

今回はdartを使って勝手にorelangを実装してみました。

できたもの

これが完成品を置いているリポジトリです。
だいぶテキトーだしエラー処理も甘いし抽象化も雑魚いので大目に見てやって下さい。

https://github.com/Uchijo/orelang_dart

工夫を試みた箇所

Objectをなるべく使わない

Javaの実装ではObject型が多用されています。どうせなので型に守られてプログラミングしたいなぁと思い、できるだけObject型を使わないようにしました。
その結果、EvalResultとかいう謎のresultクラスが完成しました。

orelangでは全てが式であり、式を評価していくと最終的に以下の3つにたどり着きます。

  • 整数
  • ブール
  • 値なし

これらを全てObjectでまとめるよりは、ということでEvalResultというクラスを作成しました。
int, bool, EvalResultTypeのフィールドを持ち、EvalResultTypeで保存されている型が何なのかを確認することができます。
整数ならintのフィールドに値が入り、ブールならboolのフィールドに値が入り‥という感じです。
(dartにユニオンがあればもっときれいに実装できるんだけどなぁ‥)

また、IOperator#callの第二引数の型をList<IExpression>に変更しました。結果から書くと、これは大きな間違いでした
IOperatorの実装には、変数のset, getなどの処理も含まれています。その際、set, getに渡される引数は変数の識別子なのです。
これを式(つまりIExpression)にするとなにかがおかしい感じになってしまいます。
今回はあまり時間をかけて作る気分ではなかったので、しょうがなくIExpressionを実装したIdentifier型をつくり、渋々それを使うという形を取りました。

何個か機能を追加してみた

orelang元記事では1時間で完成させるという制約がある関係上、機能は非常に限られています。(その制約のお陰でお手軽さと充実感の両立が実現できているはずなので本当にありがたいことです。決して機能が少ないことをディスりたい訳では無いです。)
しかし私には時間的制約はありません。ということで、最後楽しくなって追加したいくつかの機能をご紹介します。

if

皆さんご存知のif式です。["if", cond, exp1, exp2]という形で書くことができ、condtrueならexp1の評価結果が、falseならexp2の評価結果が返るというだけの式です。

and, or

これもだいたいどの言語でもある機能ですね。["and", exp1, exp2]みたいな感じで書けます。

>, <

大小比較です。ないよりあったほうが良いかな~と。

skip

何もしない命令です。値としてはnovalue、つまり値なしが返ります。
ifが式である以上else句の実装は強制したかったのですが、どうせなので命令型言語的にskipもできたほうが良いかな、と思いこれを追加しました。軸ブレブレですね‥

今後やる気が続けばやること

そういえばwhileを作って満足したせいでuntilを作ってなかったので、それの実装はしたいですね。
識別子のところは納得いってないので、いつかリファクタリングしたいなと思っております。
あとは構文解析バチバチにしたやつとかも作りたいかも‥

2
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0