Simple EL = Simplel
"Simple EL = Simplel" は、実用性を損なわない範囲内で、できるだけ単純にした式言語である。テンプレート内での使用を想定しているが他の目的でも使えるだろう。JavaScript, JSONの構文の影響を受けている。
悩んでいる点
参照を表す目印に'$'を使うべきか? Smartyな人にはドルがあったほうがいいだろうが、個人的にはうるさくて嫌い。
とりあえずドルなしでいってみる。
構文基本要素
トークン:
丸括弧には、単なるまとまりと関数呼び出しの2つの使用法がある。
- 整数リテラルは普通、JSON仕様参照
- 文字列リテラルも普通、二重引用符のみ使用。JSON仕様参照。UnicodeはUTF-8を前提。
- 名前開始文字 ::= 英字、名前文字 ::= 英字|数字|アンダスコア
[追記]'|', '$', '@'は予約。'|'はすぐに使うことになるだろう。[/追記]
構文定義
すべての空白は無視される。
- パス ::= 名前 | パス '.' 名前 | パス '[' 式 ']'
- 関数呼び出し ::= パス '(' 引数並び ')
- 引数並び ::= 空 | 式 (',' 式)*
- 式 ::= リテラル | パス | 関数呼び出し | '(' 式 ')'
データ型
- 整数 integer
- 文字列 string
- 関数 (関数も値) function
- 配列
- マップ(プロパティリスト)
配列は整数インデックス(0以上)でアクセスされ、マップは名前キーでアクセスされる。ただし、foo.bar ≡ foo["bar"]、foo.1 は構文上許されないが、意味的には foo.1 ≡ foo[1]。
環境と評価
環境(またはコンテキスト)は、式が評価されるときに名前の実体を与えるマップ。環境をE、環境へのアクセスを get_by_key/2, get_by_index/2 とすると、評価規則は、
- 【名前】= get_by_key(E, 名前)
- 【パス.名前】= get_by_key(【パス】, 名前)
- 【パス[式]】= get_by_index(【パス】, 【式】) OR get_by_key(【パス】, 【式】)
- 【関数呼び出し】 = apply(【パス】, 【引数並び】)
- 【引数並び】 = [【式1】, 【式2】, ...] (右辺はリスト)