ペア比較マクロ

(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
*/
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX