(a, b) = (c, d) みたいな書き方ができるマクロ。見やすくなる時だけ使おう。
特殊展開マクロちゅっちゅちゅー
(a, b) = (c, d) みたいな書き方ができるマクロ。見やすくなる時だけ使おう。
特殊展開マクロちゅっちゅちゅー
// コア #define global ctype _pairOpPush2(%1, %2) %t_pairOp %s2 %s1 // 逆順 (%pN の N を(左:0→右:max)にするため) #define global ctype _pairOpPush1(%1) %t_pairOp %s1 #define global _pairOpPop2 %t_pairOp %o0 %o0 #define global _pairOpPop1 %t_pairOp %o0 // 展開後の式の形 #define global _pairEq2Impl %t_pairOp (%p0 == %p2 && %p1 == %p3) #define global _pairNe2Impl %t_pairOp (%p0 != %p2 || %p1 != %p3) #define global _pairOp2Impl %t_pairOp %p0 %p4 %p2 , %p1 %p4 %p3 // { push, 展開式, pop } #define global ctype _pairRel2(%1 = impl, %2 = args, %3) \ _pairOpPush2 %3 _pairOpPush2 %2 \ %1 \ _pairOpPop2 _pairOpPop2 #define global ctype _pairOp2(%1 = impl, %2 = op, %3 = args, %4) \ _pairOpPush1(%2) _pairOpPush2 %4 _pairOpPush2 %3 \ %1 \ _pairOpPop2 _pairOpPop2 _pairOpPop1 // public #define global ctype pairEq(%1, %2) _pairRel2(_pairEq2Impl, %1, %2) #define global ctype pairNe(%1, %2) _pairRel2(_pairNe2Impl, %1, %2) #define global ctype pairOp(%1, %2 = op, %3) _pairOp2(_pairOp2Impl, %2, %1, %3) // テキトーなサンプル #if 1 #define ctype dbgstr(%1) ({"%1 = "} + (%1)) #define ctype dbgarr2(%1) ({"%1 = [ "} + %1(0) + ", " + %1(1) + " ]") a = 1 b = 2 mes dbgstr( pairEq((a, b), (1, 2)) ) // true mes dbgstr( pairNe((a, b), (3, 2)) ) // true x = pairOp( (1, 2), +, (3, 4) ) // ←見づらい mes dbgarr2( x ) #endif /* (a, b) を ctype マクロの引数にして、後は特殊展開マクロでよろしくやってるだけ n-tuple について同様に可能 */