yaml上で動くtoy言語を作り始めた

yaml上で動くtoy言語を作り始めた。 これ。

github.com

今回はコードを書く以外になるべく文章によるアウトプットを増やしてみようという試みも裏で行うことにした(そんなわけでこの記事を書いている)。

yaml上で動く言語

現在のところはlispのマクロのようなものをイメージしている。コードを読み込み読み込んだコード自体が変換され出力されるというようなもの。上手くいくかはわからない。

どこまで真面目にやるかというのもけっこう悩みどころではあるけれどとりあえず行き当たりばったりで進めてみることにする。

すごく簡単に書くと以下のような記述になる。$で始まるものが関数(action)として実行される(個人的には $ のprefixは好きではないのだけれど。yamlの構文との兼ね合いで今のところこれが一番無難だろうという考えになっている)。

$<action>:
  <body>
<kwargs>

上のようなyaml<action>(<body>, **<kwargs>) という形の関数呼び出しに変換されるようなイメージ。 例えば、以下のようなyamlは、suffix({"name": "foo"}, suffix="+") という形に変換される。

$suffix:
  name: foo
suffix: +

actionが存在した階層の同一階層のものはキーワード引数として扱われる。また、actionの戻り値がそのまま出力になる。

ネストした呼び出し

ネストしたactionの呼び出しは以下の様になる。

definitions:
  $suffix:
    $suffix:
      name: foo
    suffix: +
  suffix: "-"

関数の呼び出しは内から外に行われる。上の例では suffix(suffix({"name": "foo"}, suffix="+"), suffix="-") の意味。従って以下のような結果になる。

name+-: foo

ネストした呼び出しがまだ読みづらい気がする。そしてactionとその引数の間が離れていくのがわりとつらい。

readmeを書く

今回はそれなりに早い段階でreadmeを書くことにした。毎回readmeはテキトウになってしまうのでreadmeを充実させるというのも今回の目標の1つにしてみることにした。とりあえず、実行例を載せようということで、トップレベルで make readme を呼ぶとreadmeが生成されるというようにした。markdownに比べてReSTはコードブロックにインデントが必要になるのが面倒に感じる。