略してesc。
Rubyのerbのようなテンプレートエンジンですが、直接の影響を受けたのはPerlのepl(内輪ネタ)です。
トリム機能の使い方に関しては、erbではなくeplを参考にしています
(というよりTemplateToolKit?)
PHP、JSPのようなテキスト埋め込みなSchemeコードを処理します。
Gauche用なので、他の処理系では動きません。
こういうtemplateを、こういうscriptから呼び出す時に使う。
以下のルールに従って、解釈されます
ここは通常のテキスト <% ;;ここはSchemeのコード %> ここは通常のテキスト <%= (string-append "ここはSchemeのコードで、" "式や変数を評価した結果を挿入します") %>
もっと具体的な例は以下のように
埋め込み対象のテキストファイルがこんな感じで
<html> <% (let ((context (car args))) %> <head> <title><%= (context "title") %></title> </head> <body> <div><%= (context "message") %></div> <div> <% (if (context "bool") (begin %>真です<% ) (begin %>偽です<% )) %> </div> </body> <% ) %> </html>
esc-eval関数を呼び出すとき、テンプレートとなる文字列と、引数として与えるパラメータを渡す(第2引数以降がパラメータとなる)
与えられたパラメータは、暗黙のうちにargsという変数名のリストへまとめられます
(Perlの@_とか、JavaScriptのargumentのようなもの)
(add-load-path ".") (use esc) (define context (context-make)) (context "title" "esc example") (context "message" "test") (context "bool" #t) (display (esc-eval (call-with-input-file "index.esc" port->string) context))
context-makeの定義は簡易マッピング機能?を参照してください。
引数に使えるオブジェクトに特に制限はないので、通常の関数が受け取れるオブジェクトなら、基本的に何でも扱えます。
で、上記コードを実行すると出力されるのが以下の文字列(esc-eval関数は、文字列を返します)
<html> <head> <title>esc example</title> </head> <body> <div>test</div> <div> 真です </div> </body> </html>
Webプログラミングをしていると、どうしても共通化したい部品などが出てきますが、そういう場合は以下のようにして別のescファイルをインクルードすることが可能。
<html> <head> <title>esc example</title> </head> <body> <%= (esc-eval (call-with-input-file "common_text.esc" port->string) arg1 arg2) %> </body> </html>
上記の例では、あるescファイル中から、別のescファイル(common_text.esc)を呼び出して挿入しています。
インクルード対象のesc内でもSchemeコードの埋め込みは有効ですし、引数を与えることも可能です
(例ではarg1とarg2が引数にあたります)
改行を制御するトリム機能は以下のように
こう書くと、<html>タグの直前と</html>タグの直後にくるはずの改行が消去される
<% ;;直後の改行を最大1個だけ消す -%> <html> <body> <p>中略~</p> </body> </html> <%- ;;直前の改行を最大1個だけ消す %>