Representation - akamah/garbanzo GitHub Wiki

プログラムの表現

内部表現

プログラムのソースコードが読み込まれ、処理系が実行できる段階まで落とされたオブジェクトを、内部表現と呼ぶことにする。 これは、いわゆる抽象構文木(AST)に相当する。 これにどんな命令を用意するかが問題となっている。

最低限必要だと思われるもの

単純な型

  • 数値(Num)
  • 真偽値(Bool)
  • 文字列(String) ... バイト列を別に扱うかも検討する

複合型

  • データストア(Store)

命令

これらの命令はプリミティブに存在するのではなく、データストアに内包される形で(Lispのように)表されることにする。

  • データストアからの取り出し(Get)... 名前が似ているため変えた方が良いかもしれない。
  • データストアへの書き込み(Set)
  • 比較(Equal)
  • 表示(Print)
  • 算術命令(Add, Mult)

To DO

  • 文字列解析の各種命令

構文解析器

この言語の構文解析器は、文字列を入力されると、結果と残りの文字列を出力する関数の内部表現とする。 したがって、内部表現には関数(クロージャ)が含まれる。

設計方針

他の言語とは違って、構文解析器を構成しやすいような内部表現を持たせたい。

リストについて

今のところ、リストは "head", "tail"を持つデータストアオブジェクトで構成された線形リストを検討している。 理由は、新たに複合データ型を導入せずともよく、最も単純になること。

データストアオブジェクトに,ユーザが任意に与える順序を導入することでこの問題を解決した.

値の表現と作成

数値や文字列などの、アトミックなオブジェクトは、3と書いたり"hoge"と書いて、どちらもその値を表現することと、またその値を生成することを意味することができる。 足し算の場合、1 + 2と書いただけでは、文脈によっては足し算を表す構文木なのか、それとも足し算を実行せよという命令なのかが解釈できない。

要は、evalを実行して意味が変わるオブジェクトをどう扱うかである。 いま現状、足し算、かけ算、比較などを表す構文木としてのオブジェクトをネイティブに作成している。

この問題に対して、2つのアプローチがある。

  • ネイティブに値を作成する関数を用意し、それを通じて値を作成する。
  • 値を作成する命令そのものを幾つか作成し、データストアオブジェクトの評価によって実行する。

関数について、詳しいことが決まっていない現状、後者が現実的だと考える。