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.
I can also treat functions as first-order data using Function pointers.
struct
s as classes in their own source files and use function pointers as methods. -- requires import Control.Monad.Instances
let loeb x = fmap ($ loeb x) x in
(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))))))))
(define id (lambda (x) x)) ;; lda_id_1
(define unit id)
(define cons
(lambda (x) ;; lda_cons_1
(lambda (y) ;; lda_cons_2
(lambda (f) ;; lda_cons_3
(lambda (is-nil) ;; lda_cons_4
((f x) y))))))
(define nil
(lambda (f) ;; lda_nil_1
(lambda (is-nil) ;; lda_nil_2
(is-nil unit))))
(define do-nothing
(lambda (unit) nil)) ;; lda_do_nothing_1
(define car
(lambda (x) ;; lda_car_1
(lambda (is-nil) ;; lda_car_2
(lambda (ret) ;; lda_car_3
((x (lambda (xcar) ;; lda_car_4
(lambda (xcdr) ;; lda_car_5
(ret (xcar unit)))))
is-nil)))))
(define cdr
(lambda (x) ;; lda_cdr_1
(lambda (is-nil) ;; lda_cdr_2
(lambda (ret) ;; lda_cdr_3
((x (lambda (xcar) ;; lda_cdr_4
(lambda (xcdr) ;; lda_cdr_5
(ret (xcdr unit)))))
is-nil)))))
(define zero nil)
(define increment
(lambda (x) ;; lda_increment_1
((cons (lambda (unit) zero)) ;; lda_increment_2
(lambda (unit) x)))) ;; lda_increment_3
(define decrement cdr)
(define add
(lambda (x) ;; lda_add_1
(lambda (y) ;; lda_add_2
(((decrement y)
(lambda (unit) x)) ;; lda_add_3
(lambda (y-dec) ;; lda_add_4
((add (increment x))
(y-dec unit)))))))
(define sub
(lambda (x) ;; lda_sub_1
(lambda (y) ;; lda_sub_2
(lambda (is-positive) ;; lda_sub_3
(lambda (is-zero) ;; lda_sub_4
(lambda (is-negative) ;; lda_sub_5
(((decrement x)
(lambda (unit) ;; lda_sub_6
(((decrement y) is-zero)
(lambda (y-dec) ;; lda_sub_7
(is-negative y)))))
(lambda (x-dec) ;; lda_sub_8
(((decrement y)
(lambda (unit) (is-positive x))) ;; lda_sub_9
(lambda (y-dec) ;; lda_sub_10
(((((sub (x-dec))
(y-dec))
is-positive)
is-zero)
is-negative)))))))))))
(define disp1
(lambda (lis) ;; lda_disp1_1
((lis (lambda (car) ;; lda_disp1_2
(lambda (cdr) ;; lda_disp1_3
(disp (car unit))
(disp2 (cdr unit)))))
do-nothing)))
(define disp2
(lambda (lis) ;; lda_disp2_1
((lis (lambda (car) ;; lda_disp2_2
(lambda (cdr) ;; lda_disp2_3
(display " ")
(disp (car unit))
(disp2 (cdr unit)))))
do-nothing)))
(define disp
(lambda (lis) ;; lda_disp_1
(display "(")
(disp1 lis)
(display ")")))
(define prin ;; lda_prin_1
(lambda (lis)
(disp lis)
(newline)))
(define len1
(lambda (lis) ;; lda_len1_1
(lambda (acc) ;; lda_len1_2
((lis (lambda (car) ;; lda_len1_3
(lambda (cdr) ;; lda_len1_4
((len1 (cdr unit))
(increment acc)))))
(lambda (unit) acc))))) ;; lda_len1_5
(define len
(lambda (lis) ;; lda_len_1
((len1 lis) zero)))
(define fmap
(lambda (f) ;; lda_len_1
(lambda (lis) ;; lda_len_2
((lis (lambda (car) ;; lda_len_3
(lambda (cdr) ;; lda_len_4
((cons (lambda (unit) ;; lda_len_5
(f (car unit))))
(lambda (unit) ;; lda_len_6
((fmap f) (cdr unit)))))))
(lambda (unit) nil))))) ;; lda_len_7
(define loeb
(lambda (lis) ;; lda_loeb_1
((fmap (lambda (f) ;; lda_loeb_2
(f (loeb lis))))
lis)))
(prin (loeb ((cons (lambda (unit) len)) ;; lda_main_1
(lambda (unit) ;; lda_main_2
((cons (lambda (unit) len)) ;; lda_main_3
(lambda (unit) ;; lda_main_4
((cons (lambda (unit) len)) ;; lda_main_5
(lambda (unit) nil)))))))) ;; lda_main_6
if
trivial - given a predicate p and statements F,G, if p then F else G
is simply pFG