Nimのテンプレートエンジンにも使えるSCF

Nim

nim言語には、「Source Code Filter(以下、SCF)」というものが、デフォルトで存在します。
これは、メモリにコードを読み込んだときに、予め定義しておいた変数を外部から渡された値に置換し、
その結果を得ることが出来る機能です。

以下に例を示します。

テンプレートファイルを使ってみる

「test.tmpl」という名前で、以下のファイルを作成してください。

#? stdtmpl | standard
#proc tmpl_sample(): string =
#  result = ""
This is sample text.

次に上でつくたファイルを実行するnimのコードを作成します。
名前はとりあえず「test.nim」とします。

# tmplファイルの読み込み
include "test.tmpl"

echo tmpl_sample()

test.nimを実行してみると、CUI上に「This is sample text.」という文字が表示されると思います。

> nim c -r test.nim

# This is sample text.

テンプレートに引数を渡してみる

test.tmplを書き換えてみます。

#? stdtmpl | standard
#proc tmpl_sample(arg1: string): string =
#  result = ""
This is sample text.
You put "$arg1"!

2行目の「tmpl_sample」プロシージャに引数を追加し、
You put "$arg1"!」を行末に追加しています。

更に、「test.nim」も更新します。

# tmplファイルの読み込み
include "test.tmpl"

echo tmpl_sample("hello!")

tmpl_sampleプロシージャに引数を渡しました。
実行してみましょう。

> nim c -r test.nim

# This is sample text.
# You put "hello!"!

正常に値が渡され、展開されたものが取得できていますね!
いい感じです。

仕組み

SCFは「#? stdtmpl | standard」という句で利用ができるようになります。
デフォルトは「#」で始まる行が、Nimのコードと認識されるようになります。

なのでtmplファイル内で、ifなども使うことができます。

#? stdtmpl | standard
#proc tmpl_sample(arg1: string): string =
#  result = ""
This is sample text.
You put "$arg1"!

# if arg1 == "hello":
    Hi!
# else:
    Who are you?

参考