Name: Anonymous 2013-11-18 10:44
Why not? I can just avoid side-effects. I can also treat functions as first-order data using Function pointers.
(define id (lambda (x) x))
(define true (lambda (x y) x))
(define false (lambda (x y) y))
(define cons (lambda (x y) (lambda (f is-nil) (f x y))))
(define nil (lambda (f is-nil) (is-nil)))
(define do-nothing (lambda () nil))
(define car
(lambda (x is-nil ret)
(x (lambda (xcar xcdr) (ret (xcar)))
is-nil)))
(define cdr
(lambda (x is-nil ret)
(x (lambda (xcar xcdr) (ret (xcdr)))
is-nil)))
(define zero nil)
(define increment
(lambda (x)
(cons (lambda () zero)
(lambda () x))))
(define decrement cdr)
(define add
(lambda (x y)
(decrement y
(lambda () x)
(lambda (y-dec)
(add (increment x) (y-dec))))))
(define sub
(lambda (x y is-positive is-zero is-negative)
(decrement x
(lambda ()
(decrement y is-zero is-negative))
(lambda (x-dec)
(decrement y
(lambda () (is-positive x))
(lambda (y-dec)
(sub (x-dec) (y-dec) is-positive is-zero is-negative)))))))
(define disp1
(lambda (lis)
(lis (lambda (car cdr)
(disp (car))
(disp2 (cdr)))
do-nothing)))
(define disp2
(lambda (lis)
(lis (lambda (car cdr)
(display " ")
(disp (car))
(disp2 (cdr)))
do-nothing)))
(define disp
(lambda (lis)
(display "(")
(disp1 lis)
(display ")")))
(define prin
(lambda (lis)
(disp lis)
(newline)))
(define len1
(lambda (lis acc)
(lis (lambda (car cdr)
(len1 (cdr) (increment acc)))
(lambda () acc))))
(define len
(lambda (lis)
(len1 lis zero)))
(define fmap
(lambda (f lis)
(lis (lambda (car cdr)
(cons (lambda () (f (car)))
(lambda () (fmap f (cdr)))))
(lambda () nil))))
(define loeb
(lambda (lis)
(fmap (lambda (f)
(f (loeb lis)))
lis)))
;(prin zero)
;(prin (increment zero))
;(prin (increment (increment zero)))
;(prin (cons (lambda () (cons (lambda () nil) (lambda () nil)))
; (lambda () (cons (lambda () nil)
; (lambda () nil)))))
;(prin (fmap increment (increment (increment zero))))
(prin (loeb (cons (lambda () len)
(lambda ()
(cons (lambda () len)
(lambda ()
(cons (lambda () len)
(lambda () nil))))))))