|
|
|
@ -10,37 +10,43 @@
|
|
|
|
|
(define return-ccs empty)
|
|
|
|
|
|
|
|
|
|
(define (b-gosub num-expr)
|
|
|
|
|
(let/cc here-cc
|
|
|
|
|
(push! return-ccs here-cc)
|
|
|
|
|
(let/cc this-cc
|
|
|
|
|
(push! return-ccs this-cc)
|
|
|
|
|
(b-goto num-expr)))
|
|
|
|
|
|
|
|
|
|
(define (b-return)
|
|
|
|
|
(unless (pair? return-ccs)
|
|
|
|
|
(unless (not (empty? return-ccs))
|
|
|
|
|
(raise-line-error "return without gosub"))
|
|
|
|
|
(define top-return-cc (pop! return-ccs))
|
|
|
|
|
(top-return-cc (void)))
|
|
|
|
|
(define top-cc (pop! return-ccs))
|
|
|
|
|
(top-cc (void)))
|
|
|
|
|
|
|
|
|
|
(define thunk-table (make-hasheq))
|
|
|
|
|
(define next-funcs (make-hasheq))
|
|
|
|
|
|
|
|
|
|
(define-macro-cases b-for
|
|
|
|
|
[(_ LOOP-ID START END) #'(b-for LOOP-ID START END 1)]
|
|
|
|
|
[(_ LOOP-ID START END STEP)
|
|
|
|
|
#'(b-let LOOP-ID (let/cc loop-cc
|
|
|
|
|
(hash-set! thunk-table
|
|
|
|
|
'LOOP-ID
|
|
|
|
|
(λ ()
|
|
|
|
|
(define next-val (+ LOOP-ID STEP))
|
|
|
|
|
(if (next-val . in-closed-interval? . START END)
|
|
|
|
|
(loop-cc next-val)
|
|
|
|
|
(hash-remove! thunk-table 'LOOP-ID))))
|
|
|
|
|
START))])
|
|
|
|
|
#'(b-let LOOP-ID
|
|
|
|
|
(let/cc loop-cc
|
|
|
|
|
(hash-set! next-funcs
|
|
|
|
|
'LOOP-ID
|
|
|
|
|
(λ ()
|
|
|
|
|
(define next-val
|
|
|
|
|
(+ LOOP-ID STEP))
|
|
|
|
|
(if (next-val
|
|
|
|
|
. in-closed-interval? .
|
|
|
|
|
START END)
|
|
|
|
|
(loop-cc next-val)
|
|
|
|
|
(hash-remove! next-funcs
|
|
|
|
|
'LOOP-ID))))
|
|
|
|
|
START))])
|
|
|
|
|
|
|
|
|
|
(define (in-closed-interval? x start end)
|
|
|
|
|
((if (< start end) <= >=) start x end))
|
|
|
|
|
|
|
|
|
|
(define-macro (b-next LOOP-ID)
|
|
|
|
|
#'(begin
|
|
|
|
|
(unless (hash-has-key? thunk-table 'LOOP-ID)
|
|
|
|
|
(raise-line-error "next without for"))
|
|
|
|
|
(define thunk (hash-ref thunk-table 'LOOP-ID))
|
|
|
|
|
(thunk)))
|
|
|
|
|
(unless (hash-has-key? next-funcs 'LOOP-ID)
|
|
|
|
|
(raise-line-error
|
|
|
|
|
(format "`next ~a` without for" 'LOOP-ID)))
|
|
|
|
|
(define func (hash-ref next-funcs 'LOOP-ID))
|
|
|
|
|
(func)))
|