2012-04-20 2 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) 

쿨! 내가 원한 것은 이것이다 :

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

위와 같은 결과를 얻으려면. BIND는 무엇이 될 수 있습니까? 나는 해킹을 시도했고, 이것이 거의 가능하다는 것을보고 할 수있다. 그러나 그것은 일반적이지 않고 예쁘지 않습니다. 이 작업을 수행 할 수 있습니까 ? (즉, 순수한 CPP로 실제 기능적 기능을 구축 할 수 있습니까?) 바운드 매크로를 바인딩 할만큼 충분히 수행 할 수 있습니까?

아마 내가 묻는 것은 당신이 알고있는 모든 선행 처리기 라이브러리에 이와 같은 도구가 있는지 여부입니다. 나는 Boost에서 이와 비슷한 것을 찾지 못했습니다.

+3

전 처리기로 너무 많은 작업을하면 코드가 나중에 디버그/이해할 수있는 악몽이 될 수 있습니다. –

+1

Boost 항목은 Vesa Karvonen의 작업을 기반으로합니다.이 작업은 사전 처리기에서 어휘 환경, 꼬리 재귀 등으로 완전한 함수 언어를 구현 한 것입니다. 따라서 "부스트에서 이와 같은 것을 찾지 못했습니다"라는 것에 회의적입니다. 확실합니까? 좋은 간단하고 부분적인 응용 프로그램 구문에서는 그렇진 않습니다. – Kaz

답변

4

거시적 인 프로그래밍을 요청할 수 없습니다. 죄송합니다.

+2

아름다움은 보는 사람의 눈에 있습니다. 하지만 OK, "pretty"를 잊어 버리십시오. "general"로 그냥 머물러보십시오. 전처리 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

재미있는 아이디어는 있지만, 숫자가있는 간단한 예는 그 예일뿐입니다. 실제로는 문자열이나 artibtrary 표현식 (리터럴 2 대신에)을 바인딩해야 할 수도 있습니다. –

2

언밸런스 괄호 바인드 작업의 종류를 할 수있는 매크로 함수 호출을 구성하는 것입니다,하지만 호출 구문은 일반적인 다른 매크로. 여분의 가까운 needs이 필요해.

#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) 
) 

; 주문은 기본적으로 ML 스타일의 부분적인 평가를 지원하므로 그냥 쓸 수 있습니다 : C 전처리에 의해 부과 된 약간 이상한 구문에서 제외

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

은, 언어가 기본적으로 매우 간단 리스프/많은 지원 ML의 하이브리드 공통 기능 관용구.

관련 문제