モチベーション
- 自分がビルドしているときだけコンパイルされるコードを入れたい。
- 特定の環境上でビルドしているときだけ組み込まれるメソッドが欲しい。
解決方法
次のマクロを使う。
# pythonじゃないよ、Booだよ。
import System
import Boo.Lang.Compiler.Ast
macro ifenv( en as ReferenceExpression, v as StringLiteralExpression ):
# macro内のコードはマクロ展開時(コンパイル時)に実行される。
# よって、un にはコンパイル環境上の環境変数値が代入される。
un = Environment.GetEnvironmentVariable( en.Name )
# 引数で指定した文字列なら、ifenvマクロの本体ブロックを展開。
yield ifenv.Body if un == v.Value
使用方法
次のような感じ。ifdef のように使用出来る。
ifenv USER, "nistake":
print "hello nistake!" # 環境変数USER=='nistake'のときだけコンパイルされる。
結論
あまりオレオレコードをたくさん入れると、他人には何のゴミだと思われることもあります。
おまけ
Boo の ifdef は、この ifenv マクロと同じく、言語コアな機能ではなくただのマクロです(Booコンパイラソース " src/Boo.Lang.Extensions/Macros/IfdefMacro.boo)。