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