-void print(...) = #1;
+// method 0
+#define METHOD__(...) __VA_ARGS__
+#define METHOD_0(F,A) F METHOD__(A)
-#define NOPARENS(...) __VA_ARGS__
-#define callem(func, args) func NOPARENS(args)
+// method 1
+#define METHOD_1(F,A) F(METHOD__ A)
-#define callen(func, ...) func __VA_ARGS__##[0]
+// method 2
+#define METHOD_2(F,...) F __VA_ARGS__##[0]
+
+// method 3
+#define METHOD_3(F,...) F __VA_ARGS__
+
+// selector
+#define METHOD(I, F, ...) METHOD_##I (F, __VA_ARGS__)
void main() {
- print(NOPARENS("hello ", "world\n"));
- callem(print, ("Yay", ", there\n"));
- callen(print, ("Woah",", there\n"));
+ METHOD(0, print, ("Method", " <zero>\n"));
+ METHOD(1, print, ("Method", " <one>\n"));
+ METHOD(2, print, ("Method", " <two>\n"));
+ METHOD(3, print, ("Method", " <three>\n"));
}