テンプレートエンジン書くのに便利な機能がいくつかある.
コンパイル時に関数が実行出来る.標準ライブラリの有名所は大抵コンパイル時にも動く(std.algorithm, std.range, std.string, etc...).
import std.random, std.stdio;
size_t r()
{
auto r = new Random;
scope (exit) { r.destroy; }
r.popFront();
return r.front;
}
pragma(msg, r());
void main() {}
CTFE時にtrueになる特殊変数.コンパイル時とランタイムで処理を分岐できる.
コンパイル時にファイル読み込める
#!/usr/bin/env rdmd -J.
import std.stdio;
enum fileContent = import("ctfe.d");
void main()
{
writeln(fileContent);
}
文字列をD言語のコードとしてそこに埋め込める機能
import std.stdio;
void main()
{
mixin("
struct Hoge
{
int a = 100;
}
");
Hoge hoge;
writeln(hoge.a);
}
これで大抵なんとかなる.
- RPCのコンパイル時生成: https://github.com/msgpack-rpc/msgpack-rpc-d/blob/master/src/msgpackrpc/server.d
- パーサをコンパイル時に生成してコンパイル時にパース: http://qiita.com/youxkei/items/5ccc36a9a0b0c50ee6ee
- 正規表現をあらかじめパースして高速化: http://dlang.org/phobos/std_regex.html#.ctRegex
- mustache-d: 普通のテンプレートエンジン: https://github.com/repeatedly/mustache-d
- diet: vibe.d標準のコンパイル時jadeテンプレートパーサ: http://vibed.org/templates/diet
ランタイムに普通にパースして,普通に値をテンプレートに適用していく.コンパイル時に動くように多分出来るけど,やってない.
コンパイル時にテンプレートをパースしてHTMLやフィルターの変換処理を施し,結果をD言語のコードとして埋め込む.
import("file") -> HTML変換 -> フィルター適用(markdown変換,D言語コード埋め込み) -> 文字列 -> mixinで埋め込む
https://github.com/rejectedsoftware/vibe.d/blob/master/source/vibe/textfilter/markdown.d