text.template
- 簡単なテンプレート拡張 ¶このモジュールは、Gauche組み込みの文字列補間機能をより一般的なテンプレートエンジンとして 使えるようにするものです。
Gaucheの文字列補間構文はソース読み込み時にマクロ呼び出しへと展開され、 さらにマクロ展開器により展開されて単純なSchemeコード片となります。 例えば、次のソースコードがある場合:
(let ([x 10]) #"The square of x is ~(* x x).")
マクロ展開後の最終形は次のコードになります:
(let ([x 10]) (string-append '"The square of x is " (x->string (* x.0 x.0)) '"."))
これも一種のテンプレート展開と言えるのですが、文字列補間ではテンプレート文字列が 文字列リテラルとしてソースコード上に現れていなければならないという制限があります。 このモジュールでは、文字列と束縛を実行時に与えることができます:
(define *template* "The square of x is ~(* x x).") (expand-template-string *template* (make-template-environment :bindings '(x 10))) ⇒ "The square of x is 100."
テンプレート文字列の構文は文字列補間のそれと同じです(文字列の補間参照)。
すなわち、~
に続くトークンがScheme式として呼ばれます。もしトークンがシンボルで、
その後の続く文字から区切る必要がある場合は、|
によるシンボルエスケープが使えます。
また、テンプレート展開時には、テンプレート中の式を評価するための テンプレート環境を与える必要があります。 文字列補間と違って、テンプレート中の式がローカル束縛を参照することはできません。
テンプレート文字列templateを、テンプレート環境envのもとで展開し、 結果の文字列を返します。
テンプレート文字列をfilenameで指定されるファイルから読み込み、 テンプレート環境envのもとでそれを展開し、結果の文字列を返します。
filenameが絶対パスでない場合は、paths中のディレクトリからの相対パスで 探されます。
テンプレート環境を作成して返します。テンプレート環境はモジュールのようなものです (モジュール参照)。それはシンボルを値にマップし、 また他のモジュールから束縛をインポートしたり、他のモジュールをextendしたりできます。
キーワード引数extendsとimportsはシンボルのリストを取り、 それぞれ継承元のモジュール、あるいはインポート元のモジュールを指定します。
キーワード引数bindingsはディクショナリ(<dictionary>
のサブクラスの
インスタンス)か、key-valueリストでなければなりません。
それにより表される束縛が環境に取り込まれます。