rowlの式

rowlの式として以下の定義を使う方針にしました。その為、いろいろと実装の修正を行っています。

この表現もLISPと同じくSymbol expression、つまりS式と呼ばれます。各々を区別する呼称があった気がするけど忘れたので、ここでは仮にσ式と呼ぶ事にしときます。
σ式とS式は本質的には同じで、

  • S式のドット対(a . b)はσ式のCons(a, b)で表現できる

と考えても良いし

  • σ式のh(e1, ..., en)はS式の(h e1 ... en)と表現できる

と考えても良いです。
σ式では例えば,1+2*3はPlus(1, Times(2, 3))の様な自然な表現になります。このようなヘッドを明に持った表現は構文木表現としてはS式よりも一般的で、それを表層のレベルでも採用している処理系としてはMathematicaが有名です。

S式にしろσ式にしろ、構文木もデータも同じ形で表現されるからいじくりまわすのが簡単であるという利点はそんなに変わりません。S式の方がより表現がシンプルなので扱い安いのですが、LISPの記法が嫌なのと、式の意味を表すヘッドが明示的である方が好みであることからσ式を採用する事にしました。

構文糖衣

組み込みの構文糖衣

  • [e1, ..., en] → List(e1, ..., en)
  • (e1, ..., en) → Tuple(e1, ..., en)
  • {e1 ... en} → Block(e1, ..., en)
  • e1(e2, ..., en)
    • e1がシンボルの時はそのまま
    • それ以外はApply(e1, List(e2, ..., en))
  • e1[e2, ..., en] → Subscr(e1, List(e2, ..., en))

前置・後置・中置演算子とコンストラクタは組み込みは無しでユーザ側・ライブラリ側で定義。