CPPで真偽値とリスト

CPPはC PlusPlusじゃなくてC PreProcessorだよ!

gcc -E nanntoka.c

で実行。

#define par_open (
#define par_close )

#define cat_(a,b) a##b
#define cat(a,b) cat_(a,b)

#define defif_0(t, f) f
#define defif_1(t, f) t
#define defif_(b, t, f) defif_##b(t, f)
#define defif(b, t, f) defif_(b, t, f)

#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_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 defcar_(car, cdr) car
#define defcar(list) defcar_ list
#define defcdr_(car, cdr) cdr
#define defcdr(list) defcdr_ list

#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))));