福澤テクノロジー

おっさんプログラマーが、主に技術的な話をするブログ。

Lazy Here-document (仮) をmrubyに実装してみた

Hayat言語の特殊機能 sayCommand - 福澤テクノロジー にて、sayCommand機能を紹介しましたが、言語仕様としては不恰好で一般的とは言えません。
そこで、他の言語にも採用してもらえそうな仕様を考えました。
仮に、Lazy Here-document と名付けてみました。式展開をその場で評価しないというような意味合いで。

Rubyに組み込んだと想定して書いてみます。
<<< で開始しHere documentと同じ様に記述するのですが、値は文字列ではなく配列になります。
式展開は実行されず、Procオブジェクトとなります。

a = <<<EOH
aaa#{ 1 + 2 }bbb
ccc
EOH

a.map{ |x| x.class }
# => [String, Proc, String, String]

a.map{ |x| x.class == Proc ?  x.call().to_s : x }.join('-')
# => "aaa-3-bbb\n-ccc\n"

これであれば、配列リテラルの一種として一般化出来て、sayCommandのような余計なメソッドを定義する必要もありません。


これを、mrubyに実装してみました! (これをしたかったが為に、mrubyにHere documentを実装したのでした。)
https://github.com/FUKUZAWA-Tadashi/mruby.git
heredocブランチにコミットしてあります。

Rubyの仕様から外れているので、 pull request はしていません。
mrbgem に出来ればいいんだけど、parse.y や codegen.c を変更しているので、出来ない。(と思う)

現状の課題
  • Lazy Here-document と呼ぶ?
  • 開始は <<< でいいのか?
  • <<<'EOH' でも式展開をしてしまっている
  • <<<- で終端文字列がインデント出来るようになっていない