And now for the motivation...
In Python:
def true(x, y): return x def false(x, y): return y def Not(x): return x(false, true) def And(x, y): return x(y, false) def Or(x, y): return x(true, y) def Xor(x, y): return x(Not(y), y)
In C++:
#include <assert.h> #include <stdio.h> struct Boolean { typedef struct Boolean (*booleanSignature)(Boolean, Boolean); Boolean(booleanSignature ptr) : _ptr(ptr) { } operator booleanSignature() const { return _ptr; } private: booleanSignature _ptr; }; Boolean True(Boolean x, Boolean y) { return x; } Boolean False(Boolean x, Boolean y) { return y; } Boolean Not(Boolean x) { return x(False, True); } Boolean And(Boolean x, Boolean y) { return x(y, False); } Boolean Or(Boolean x, Boolean y) { return x(True, y); } Boolean Xor(Boolean x, Boolean y) { return x(Not(y), y); } #define ASSERT(cond) \ printf("%s %s\n", (cond) ? "true " : "false", #cond) int main() { ASSERT(And(True, True) == True); ASSERT(And(True, False) == False); ASSERT(Or (True, False) == True); ASSERT(Or (False, False) == True); ASSERT(Not(False) == True); ASSERT(Xor(And(True, False), Or(False, True)) == True); }