是否可以在C预处理器中进行部分宏应用/ currying?

Dyl*_*lan 3 c currying partial-application c-preprocessor

作为问题的一个例子,有没有办法partialconcat在下面的代码中实现宏?

#define apply(f, x) f(x)

apply(partialconcat(he),llo) //should produce hello
Run Code Online (Sandbox Code Playgroud)

编辑:

这是另一个例子,给定一个FOR_EACH可变参数宏(参见另一个问题的答案中的示例实现).

假设我想在几个对象上调用一个成员,可能在另一个宏中用于更大的目的.我想要一个宏callAmber,其行为如下:

FOR_EACH(callMember(someMemberFunction), a, b, c);
Run Code Online (Sandbox Code Playgroud)

产生

a.someMemberFunction(); b.someMemberFunction(); c.someMemberFunction();
Run Code Online (Sandbox Code Playgroud)

这需要callMember(someMember)产生一个行为像的宏

#define callMember_someMember(o) o.someMember()
Run Code Online (Sandbox Code Playgroud)

Leu*_*nko 5

使用Vesa Karvonen令人难以置信的"Order"语言/库,您可以使用预处理器获得所需的结果:http://rosettacode.org/wiki/Order

这可以通过在预处理器本身之上实现第二个高级语言来实现,同时支持currying和一流宏等等.这是非常繁重的,但非常重要的Order代码需要很长时间才能编译,因为CPP并不是以这种方式设计的,大多数C编译器都无法处理它.它也非常脆弱:输入代码中的错误往往会产生难以理解的乱码输出.

但是,是的,它可以完成,并在一个预处理器传递中完成.这只是很多复杂得多,你可能已经预期.