aboutsummaryrefslogtreecommitdiff
path: root/sem7/pp/lec3.scm
diff options
context:
space:
mode:
Diffstat (limited to 'sem7/pp/lec3.scm')
-rw-r--r--sem7/pp/lec3.scm125
1 files changed, 125 insertions, 0 deletions
diff --git a/sem7/pp/lec3.scm b/sem7/pp/lec3.scm
new file mode 100644
index 0000000..7babbb8
--- /dev/null
+++ b/sem7/pp/lec3.scm
@@ -0,0 +1,125 @@
+(define (to-string thing)
+ (let ([format-pair-tail
+ (lambda (tail)
+ (apply string-append (cond [(null? tail) (list "")]
+ [(pair? tail) (list " " (to-string tail))]
+ [else (list " . " (to-string tail))])))
+ ])
+ (cond [(number? thing) (number->string thing)]
+ [(symbol? thing) (symbol->string thing)]
+ [(null? thing) "()"]
+ [(procedure? thing) "#function#"]
+ [(pair? thing) (string-append
+ (to-string (car thing))
+ (format-pair-tail (cdr thing)))]
+ [(string? thing) thing]
+ [else "?"]
+ )))
+
+(define (create-dispatch methods super-func)
+ (lambda (msg)
+ (let ([method (assoc msg methods)])
+ (if method (cdr method) ((super-func) msg))
+ )))
+
+(define (send obj msg . para)
+ (let ((method (obj msg)))
+ (apply method para)))
+
+(define (new-instance class . para)
+ (apply class (cons '() para)))
+
+;; TODO implement str
+(define (object self-into)
+ (letrec ([whoami 'object]
+ [dispatch (create-dispatch (list
+ [cons 'pretty-str (lambda ()
+ (to-string (send (self) 'pretty)))]
+ [cons 'pretty (lambda () (list whoami))]
+ [cons 'type-of (lambda () whoami)]
+ [cons 'class-of (lambda () object)]
+ ) '())]
+ [self (lambda () (if (null? self-into) dispatch self-into))]
+ ) dispatch))
+
+(define (point self-into x y)
+ (letrec ([whoami 'point]
+ [super (lambda () (object (self)))]
+ [self (lambda () (if (null? self-into) (dispatch) self-into))]
+ [pretty (lambda () (list whoami x y))]
+ [move (lambda (dx dy)
+ (send (self) 'add (new-instance point dx dy)))]
+ [add (lambda (other)
+ (new-instance (send (self) 'class-of) (+ x (send other 'getx))
+ (+ y (send other 'gety))
+ ))]
+ [with-color (lambda (color) (new-instance color-point
+ (send (self) 'getx)
+ (send (self) 'gety)
+ color))]
+ [dispatch (lambda () (create-dispatch (list
+ [cons 'getx (lambda () x)]
+ [cons 'gety (lambda () y)]
+ [cons 'add add]
+ [cons 'pretty pretty]
+ [cons 'move move]
+ [cons 'type-of (lambda () whoami)]
+ [cons 'class-of (lambda () point)]
+ [cons 'with-color with-color]
+ ) super))]
+ ) (dispatch)))
+
+(define p1 (new-instance point 10 20))
+(define p2 (new-instance point 1 1))
+
+(define (color-point self-into x y . color)
+ (let ((color (if (null? color) 'green (car color))))
+ (letrec ([whoami 'color-point]
+ [super (lambda () (point (self) x y))]
+ [self (lambda () (if (null? self-into) (dispatch) self-into))]
+ [pretty (lambda () (list whoami
+ (send (self) 'getx)
+ (send (self) 'gety)
+ color))]
+ [dispatch (lambda () (create-dispatch (list
+ [cons 'get-color (lambda () color)]
+ [cons 'type-of (lambda () whoami)]
+ [cons 'pretty pretty]
+ [cons 'class-of (lambda () color-point)]
+ ) super))]
+ ) (dispatch))))
+
+;;# Exercise 3.7
+;;? What is the value of the expression
+(let ((x 1)
+ (y 2)
+ (z 3)
+ (v 5))
+ (cons x
+ (call/cc (lambda (e)
+ (cons y
+ (cons z
+ (if (even? v) v (e (+ v 1)))))))))
+;; Okay lets start by looking at it:
+;; Okay, we define x y z and v
+;; Then we create a cons with x and the continuations, so the result must be
+;; something like (1 . ???)
+;; If v is even, it will do some cons stuff with the other guys, but it's not.
+;; Therefore the result of (call/cc ...) is (e (+ v 1)) which is 6.
+;; Therefore the result must be (1 . 6)
+
+;; Okay when running it is (1 . 6).
+
+;;# Exercise 3.4
+;;? Program (lambda (a b c) (- (* b b) (* 4 a c))) in CPS
+(define (sub a b k)
+ (k (- a b)))
+(define (mult a b k)
+ (k (* a b)))
+(define (dist a b c k)
+ (mult a c (lambda (v)
+ (mult 4 v (lambda (v1)
+ (mult b b (lambda (v2)
+ (sub v2 v1 k))))))))
+
+(define dist-old (lambda (a b c) (- (* b b) (* 4 a c))))