(mymachine (
(defmacro demoinside (expr)
(print expr)
)
(defmacro mymachineinside (exprs)
`(if ,(eq exprs nil)
nil
(progn
(demoinside ,(car exprs))
(mymachineinside ,(cdr exprs) )
)
)
)
(mymachineinside (
(defmacro demo (expr)
(print expr)
)
(defmacro mymachine (exprs)
`(if ,(eq exprs nil)
nil
(progn
(demo ,(car exprs))
(mymachine ,(cdr exprs) )
)
)
)
(setq zero
(lambda (f x)
x
)
)
(setq one
(lambda (f x)
(funcall f x)
)
)
(setq addone
(lambda (n)
(lambda (f x)
(funcall f (funcall n f x) )
)
)
)
(setq two
(funcall addone one)
)
(setq three
(funcall addone two)
)
(setq chenbing
(lambda (value)
(cons 'chenbing value)
)
)
(setq add
(lambda (m n)
(funcall m addone n )
)
)
(setq five
(funcall add two three)
)
(funcall five chenbing nil)
(setq true
(lambda (u v)
u
)
)
(setq false
(lambda (u v)
v
)
)
(setq iszero
(lambda (n)
(funcall n (lambda(x)false) true)
)
)
(setq myif
(lambda (con then else)
(funcall con then else)
)
)
(funcall myif true 'a 'b)
(funcall myif false 'a 'b)
(setq wrapsub
(lambda (f)
(lambda (p)
(cons false (funcall myif (car p) (cdr p) (funcall f (cdr p) ) ) )
)
)
)
(setq subone
(lambda (n)
(lambda ( f x)
(cdr (funcall n (funcall wrapsub f ) (cons true x) ) )
)
)
)
(setq four (funcall subone five) )
(funcall four chenbing nil)
(setq sum
(lambda( n)
(funcall myif (funcall iszero n) zero (funcall add n (funcall subone n) ) )
)
)
(setq result (funcall sum zero) )
(funcall result chenbing nil)
(setq result (funcall sum five) )
(funcall result chenbing nil)
(setq ten (funcall add five five) )
(funcall ten chenbing nil)
(setq result (funcall sum ten) )
(funcall result chenbing nil)
))
))