Implemented cintinuations and call/cc

This commit is contained in:
FelixBrendel
2020-04-03 22:47:48 +02:00
parent 419d28f4f2
commit 7a780615f9
21 changed files with 422 additions and 203 deletions
+36
View File
@@ -0,0 +1,36 @@
(define add-5 '())
(define res 1)
(mutate! res (+ 2 (call/cc (lambda (cont) (set! add-5 cont) 1)) 3))
(assert (= res 6))
(add-5 100)
(assert (= res 105))
(add-5 10)
(assert (= res 15))
;; ----------- works until here ---------------
(set! res (+ 2 (call/cc (lambda (cont) (set! add-5 cont) 1)) 3))
;; (print)
;; (print res 6)
(assert (= res 6))
(add-5 100)
;; (print res 105)
(assert (= res 105))
(add-5 10)
(assert (= res 15))
;; (print res 15)
;; (define fun '())
;; (mutate! res (apply (call/cc (lambda (k) (set! fun k) +)) (list 1 2 3)))
;; (assert (= res 6))
;; (fun -)
;; (assert (= res -1))
+2 -1
View File
@@ -3,7 +3,8 @@
(define (make-counter)
(let ((var 0))
(lambda ()
(set! var (+ 1 var)))))
(set! var (+ 1 var))
var)))
(define counter1 (make-counter))
+7 -1
View File
@@ -1 +1,7 @@
;; (define (empty-function-body-test))
(define (empty-function-body-test))
;; test that arguments to apply are only evaled once
(define counter 0)
(assert (= (apply (lambda (x) x) (begin (mutate! counter (+ 1 counter)) (list +)))
+))
(assert (= counter 1))