shift/control broken
This commit is contained in:
parent
5c59dcd564
commit
8388e8ed33
|
@ -65,8 +65,6 @@ Picrin is a lightweight scheme implementation intended to comply with full R7RS
|
||||||
|
|
||||||
- `(reset h)`
|
- `(reset h)`
|
||||||
- `(shift k)`
|
- `(shift k)`
|
||||||
- `(prompt h)`
|
|
||||||
- `(control k)`
|
|
||||||
|
|
||||||
delimited control operators
|
delimited control operators
|
||||||
|
|
||||||
|
|
|
@ -5,26 +5,28 @@
|
||||||
|
|
||||||
(define m #f)
|
(define m #f)
|
||||||
|
|
||||||
|
(define (abort t)
|
||||||
|
(let ((v (t))) ; (t) may update m. do not place me like (m (t))
|
||||||
|
(m v)))
|
||||||
|
|
||||||
(define (reset t)
|
(define (reset t)
|
||||||
|
(let ((n m))
|
||||||
(call/cc
|
(call/cc
|
||||||
(lambda (k)
|
(lambda (k)
|
||||||
(let ((n m))
|
|
||||||
(set! m (lambda (r)
|
(set! m (lambda (r)
|
||||||
(set! m n)
|
(set! m n)
|
||||||
(k r)))
|
(k r)))
|
||||||
(t)))))
|
(abort t)))))
|
||||||
|
|
||||||
(define (shift h)
|
(define (shift h)
|
||||||
(call/cc
|
(call/cc
|
||||||
(lambda (k)
|
(lambda (k)
|
||||||
|
(abort
|
||||||
|
(lambda ()
|
||||||
(h (lambda (v)
|
(h (lambda (v)
|
||||||
(reset (lambda ()
|
(reset (lambda ()
|
||||||
(k v))))))))
|
(k v))))))))))
|
||||||
|
|
||||||
(define prompt reset)
|
|
||||||
(define control shift)
|
|
||||||
|
|
||||||
(export shift
|
(export shift
|
||||||
reset
|
reset))
|
||||||
control
|
|
||||||
prompt))
|
|
||||||
|
|
Loading…
Reference in New Issue