このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

Simple EL = Simplel

"Simple EL = Simplel" は、実用性を損なわない範囲内で、できるだけ単純にした式言語である。テンプレート内での使用を想定しているが他の目的でも使えるだろう。JavaScript, JSONの構文の影響を受けている。

悩んでいる点

参照を表す目印に'$'を使うべきか? Smartyな人にはドルがあったほうがいいだろうが、個人的にはうるさくて嫌い。

とりあえずドルなしでいってみる。

構文基本要素

トークン:

  1. 整数リテラル
  2. 文字列リテラル
  3. 名前
  4. '.'
  5. '['
  6. ']'
  7. '('
  8. ')'
  9. ','

丸括弧には、単なるまとまりと関数呼び出しの2つの使用法がある。

  • 整数リテラルは普通、JSON仕様参照
  • 文字列リテラルも普通、二重引用符のみ使用。JSON仕様参照。UnicodeUTF-8を前提。
  • 名前開始文字 ::= 英字、名前文字 ::= 英字|数字|アンダスコア

[追記]'|', '$', '@'は予約。'|'はすぐに使うことになるだろう。[/追記]

構文定義

すべての空白は無視される。

  1. パス ::= 名前 | パス '.' 名前 | パス '[' 式 ']'
  2. 関数呼び出し ::= パス '(' 引数並び ')
  3. 引数並び ::= 空 | 式 (',' 式)*
  4. 式 ::= リテラル | パス | 関数呼び出し | '(' 式 ')'

データ型

  1. 整数 integer
  2. 文字列 string
  3. 関数 (関数も値) function
  4. 配列
  5. マップ(プロパティリスト)

配列は整数インデックス(0以上)でアクセスされ、マップは名前キーでアクセスされる。ただし、foo.bar ≡ foo["bar"]、foo.1 は構文上許されないが、意味的には foo.1 ≡ foo[1]。

環境と評価

環境(またはコンテキスト)は、式が評価されるときに名前の実体を与えるマップ。環境をE、環境へのアクセスを get_by_key/2, get_by_index/2 とすると、評価規則は、

  1. 【名前】= get_by_key(E, 名前)
  2. 【パス.名前】= get_by_key(【パス】, 名前)
  3. 【パス[式]】= get_by_index(【パス】, 【式】) OR get_by_key(【パス】, 【式】)
  4. 【関数呼び出し】 = apply(【パス】, 【引数並び】)
  5. 【引数並び】 = [【式1】, 【式2】, ...] (右辺はリスト)