Boost.Preprocessorを使う
ghcはC preprocessorを使える.となると,より一層強力なマクロを求めてBoost.Preprocessorを使ってみたくなるかもしれない.いや,やっぱそんなことないかもしれない.
ともかくサンプルコード
{-# LANGUAGE CPP #-} {-# OPTIONS_GHC -F -pgmF ./cpp.sh -I/usr/include #-} import Text.Printf #include <boost/preprocessor.hpp> #define FOLDL(op, e, ls) BOOST_PP_LIST_FOLD_LEFT(op, e, ls) #define ADD(d, x, a) BOOST_PP_ADD(a, x) main :: IO () main = do printf "line: %d\n" (__LINE__ :: Int) print FOLDL(ADD, 0, (1, (2, (3, BOOST_PP_LIST_NIL))))
でコンパイルには次のスクリプトcpp.shが必要
#!/bin/sh /usr/bin/cpp $1 -o $3
どうも単にpreprocessorを通すだけのオプション設定(-XCPP分のみでcpp.sh無しとか)だと,プリプロセッサマクロの深い展開ができないみたい?なので,今回はcpp.shを用意して,明示的に素のpreprocessorを通すようにしている.
これで,めでたくbuildがboostに依存する謎のHaskellコードが作成できた.一方ロシアはTemplateHaskellを(ry