Cプリプロセッサで加算までやった
数値は2進リスト。
#define par_open ( #define par_close ) #define comma , #define cat_(a,b) a##b #define cat(a,b) cat_(a,b) #define defif_val_0(t, f) f #define defif_val_1(t, f) t #define defif_(b) defif_val_##b #define defif(b) defif_(b) #define defnot(b) defif(b)(0, 1) #define defand(b1, b2) defif(b1)(b2, 0) #define defor(b1, b2) defif(b1)(1, b2) #define defxor(b1, b2) defif(b1)(defnot(b2), b2) #define defnil #define defnil_p_(car, cdr) defnil_p_true_ #define defnil_p_true_val 0 #define defnil_p_val 1 #define defnil_p(list) cat(defnil_p_ list, val) #define defifnil(x) defif(defnil_p(x)) #define defcar_(car, cdr) car #define defcar(list) defcar_ list #define defcdr_(car, cdr) cdr #define defcdr(list) defcdr_ list #define defcadr(list) defcar(defcdr(list)) #define defcddr(list) defcdr(defcdr(list)) #define defcaddr(list) defcar(defcddr(list)) #define defcdddr(list) defcdr(defcddr(list)) #define defcadddr(list) defcar(defcdddr(list)) #define defcddddr(list) defcdr(defcdddr(list)) #define defreverse_p_(r, c) defnot(defnil_p(c)) #define defreverse_f_(r, c) ((defcar(c),r),defcdr(c)) #define defreverse_p(arg) defreverse_p_ arg #define defreverse_f(arg) defreverse_f_ arg #define defreverse(list) defcar(defwhile(defreverse_p, defreverse_f, (defnil,list))) /* defwhileX repeats 2^X times. */ #define defwhile0(p, f, x) defif(p(x))(f(x), x) #define defwhile1(p, f, x) defif(p(x))(defwhile0(p, f, defwhile0(p,f,x)), x) #define defwhile2(p, f, x) defif(p(x))(defwhile1(p, f, defwhile1(p,f,x)), x) #define defwhile3(p, f, x) defif(p(x))(defwhile2(p, f, defwhile2(p,f,x)), x) #define defwhile4(p, f, x) defif(p(x))(defwhile3(p, f, defwhile3(p,f,x)), x) #define defwhile5(p, f, x) defif(p(x))(defwhile4(p, f, defwhile4(p,f,x)), x) #define defwhile6(p, f, x) defif(p(x))(defwhile5(p, f, defwhile5(p,f,x)), x) #define defwhile7(p, f, x) defif(p(x))(defwhile6(p, f, defwhile6(p,f,x)), x) #define defwhile8(p, f, x) defif(p(x))(defwhile7(p, f, defwhile7(p,f,x)), x) #define defwhile9(p, f, x) defif(p(x))(defwhile8(p, f, defwhile8(p,f,x)), x) #define defwhile10(p, f, x) defif(p(x))(defwhile9(p, f, defwhile9(p,f,x)), x) #define defwhile11(p, f, x) defif(p(x))(defwhile10(p, f, defwhile10(p,f,x)), x) #define defwhile12(p, f, x) defif(p(x))(defwhile11(p, f, defwhile11(p,f,x)), x) #define defwhile13(p, f, x) defif(p(x))(defwhile12(p, f, defwhile12(p,f,x)), x) #define defwhile14(p, f, x) defif(p(x))(defwhile13(p, f, defwhile13(p,f,x)), x) #define defwhile15(p, f, x) defif(p(x))(defwhile14(p, f, defwhile14(p,f,x)), x) #define defwhile16(p, f, x) defif(p(x))(defwhile15(p, f, defwhile15(p,f,x)), x) #define defwhile17(p, f, x) defif(p(x))(defwhile16(p, f, defwhile16(p,f,x)), x) #define defwhile18(p, f, x) defif(p(x))(defwhile17(p, f, defwhile17(p,f,x)), x) #define defwhile19(p, f, x) defif(p(x))(defwhile18(p, f, defwhile18(p,f,x)), x) #define defwhile20(p, f, x) defif(p(x))(defwhile19(p, f, defwhile19(p,f,x)), x) #define defwhile(p, f, x) defwhile20(p, f, x) #define testlist (a,(b,(c,))) defif(defand(1,0))(true, false); defif(defand(1,1))(true, false); testlist; defnil_p(testlist); defnil_p(defcdr(testlist)); defnil_p(defcdr(defcdr(testlist))); defnil_p(defcdr(defcdr(defcdr(testlist)))); #define add_a(x) a##x #define loop(arg) (defcdr(defcar(arg)), cat(a,defcdr(arg))) #define pred(arg) defnot(defnil_p(defcar(arg))) defcdr(defwhile(pred, loop, (testlist,x))); #define truefunc(x) 1 #define defnum0 #define defnum1 (1,defnum0) #define defnum2 (0,defnum1) #define defnum3 (1,defnum1) #define defnum4 (0,defnum2) #define defnum5 (1,defnum2) #define defnum6 (0,defnum3) #define defnum7 (1,defnum3) #define defnum8 (0,defnum4) #define defnum9 (1,defnum4) #define defnumA (0,defnum5) #define defnumB (1,defnum5) #define defnumC (0,defnum6) #define defnumD (1,defnum6) #define defnumE (0,defnum7) #define defnumF (1,defnum7) #define defnumcar(x) defifnil(x)(0,defcar(x)) #define defnumcdr(x) defifnil(x)(defnil,defcdr(x)) #define defplus_fulladd_re(a,b,c) defxor(a,defxor(b,c)) #define defplus_fulladd_cn(a,b,c) defor(defand(a,defor(b,c)),defand(b,c)) #define defplus_p_(r,c,x,y) defnot(defand(defnot(c),defand(defnil_p(x),defnil_p(y)))) #define defplus_f_(r,c,x,y) ((defplus_fulladd_re(c,defnumcar(x),defnumcar(y)),r),defplus_fulladd_cn(c,defnumcar(x),defnumcar(y)),defnumcdr(x),defnumcdr(y)) #define defplus_p(arg) defplus_p_ arg #define defplus_f(arg) defplus_f_ arg #define defplus_r_(r,c,x,y) r #define defplus_r(arg) defplus_r_ arg #define defplus(x,y) defreverse(defplus_r(defwhile(defplus_p, defplus_f, (defnum0, 0, x, y)))) defplus(defnum6,defnum7); defnumD;