2012-04-20 15 views
1

私はこれ(それが実際に便利なユースケースから来ていますが、私は単純化した例でプレーしてきた)のようなマクロを持っている:私は、その後機能バインド操作

を書くことができます

#define MY_MACRO(M) M(3) M(5) M(7) 
#define MULTIPLY_BY_2(A) (2*A) 

MY_MACRO(MULTIPLY_BY_2) 
// -> (2*3) (2*5) (2*7) 

Cool!私が欲しいのはこれです:

#define MULTIPLY(A,B) (A*B) 
MY_MACRO(BIND(MULTIPLY, 2)) 

上記と同じ結果が得られます。 BINDは何ができますか?私はいくつかのハックを試みましたが、これはほとんど可能です(私は驚くべきことです)と報告することができます。しかし、それは一般的ではなく、かわいくない。これはできますよく? (つまり、純粋にCPPで実際の機能的な機能を構築していますか?)バインドされたマクロをバインドするのに十分うまくできますか?

私が本当に尋ねるのは、あなたが気づいているプリプロセッサライブラリにこのようなツールがあるかどうかということでしょうか?私はBoostでこのようなものは全く見つけられませんでした。

+3

プリプロセッサであまりにも多くの処理をしようとすると、将来的にコードをデバッグ/理解することができなくなります。 –

+1

Boostは、Vesa Karvonenの著作に基づいています。これは明らかに、語彙的環境や末尾再帰などのプリプロセッサで完全な関数言語を実装しています。本気ですか?しかし、その素敵でシンプルな部分的なアプリケーション構文の下ではそうはありません。 – Kaz

答えて

4

マクロプログラミングをかなり申し訳ありません。申し訳ありません。

+2

美しさは、見る人の目の前です。しかし、OK、 "かなり"忘れて、単に "一般"と一緒にいましょう。プリプロセッサBINDのようなものが一般的に動作するように実装できますか? Boost-Preprocessorライブラリーにはこのようなことがありますか? –

1

私は、私は完全にあなたが達成したい機能の種類を理解していることを確認していないが、次のスーツはあなたの例:あなたは常に引数の周りにカッコをつけ

#define MULTIPLY_2(X) (2*(X)) 
#define POW_2(X) ((X)*(X)) 
#define BIND(OP, NUM) OP ## _ ## NUM 

MULTIPLY_2 &共同腕時計のためにあることをこれには、必要な評価オーダーがあることを確認してください。また、一般的な戦略の引数が数回評価される可能性があることにも注意してください。これは、式に副作用が含まれていると深刻なバグになる可能性があります。

ベターアンバランス括弧はバインド操作の並べ替えを行うことができますが、その後、呼び出し構文が通常と異なっている

#define MULTIPLY_2(X) multiply2(X) 
#define POW_2(X) pow2(X) 
+0

興味深い考え方ですが、いいえ、数字のある単純な例は単なる例です。実際には、文字列やアーティファクトな表現を(文字通り2の代わりに)バインドする必要があるかもしれません。 –

2

をインライン関数として、あなたの基本的な操作を持っているし、マクロで関数呼び出しを構成することですマクロ。それは余分な密な括約を必要とします。

#define BIND(op, arg) op (arg, 
#define MULTIPLY(a, b) ((a) * (b)) 

#define MULTIPLY_BY_2 BIND(MULTIPLY, 2) 

MULTIPLY_BY_2(5)) // note two close parens 

http://ideone.com/EQvs2

あなたは適切に近いかっこを生成するために、より多くのマクロを定義しようとすることができますが、よりよい解決策は、おそらくそこにあります。

1

実際、はいです。 Order libraryでは、このように上記表現できる:

bindmultiplyを手動で定義します
#include <order/interpreter.h> 

#define ORDER_PP_DEF_8my_mac ORDER_PP_FN(\ 
8fn(8M, 8seq(8ap(8M, 3), 8ap(8M, 5), 8ap(8M, 7)))) 

#define ORDER_PP_DEF_8bind ORDER_PP_FN(\ 
8fn(8F, 8A, 8fn(8X, 8ap(8F, 8A, 8X)))) 

#define ORDER_PP_DEF_8multiply ORDER_PP_FN(\ 
8fn(8L, 8R, 8times(8L, 8R)))  // (already built-in as 8times) 

ORDER_PP (
    8my_mac(8bind(8multiply, 2)) // -> (6)(10)(14) 
) 

ORDER_PP (8my_mac(8times(2))) // -> (6)(10)(14) 

を別にCプリプロセッサによって課さ少し奇妙な構文から、言語は基本的に多くのサポートにより、非常に簡単Lispの/ MLのハイブリッドである:注文も、あなただけ書くことができるように、ネイティブML-スタイル部分評価をサポートしています共通の機能イディオム。

関連する問題