1 2 3 4 5 6 7 8 9 | #lang br (require "struct.rkt") (provide b-line) (define-macro (b-line NUM STATEMENT ...) (with-pattern ([LINE-NUM (prefix-id "line-" #'NUM #:source #'NUM)]) (syntax/loc caller-stx (define (LINE-NUM) (void) STATEMENT ...)))) |
1 | (raise-line-error "return without gosub") |
1 | error in line 70: return without gosub |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #lang br (require "line.rkt" "struct.rkt") (provide run) (define (run line-table) (define line-vec (list->vector (sort (hash-keys line-table) <))) (with-handlers ([end-program-signal? (λ (exn-val) (void))]) (for/fold ([line-idx 0]) ([i (in-naturals)] #:break (>= line-idx (vector-length line-vec))) (define line-num (vector-ref line-vec line-idx)) (define line-func (hash-ref line-table line-num)) (with-handlers ([change-line-signal? (λ (cls) (define clsv (change-line-signal-val cls)) (or (and (exact-positive-integer? clsv) (vector-member clsv line-vec)) (error (format "error in line ~a: line ~a not found" line-num clsv))))]) (line-func) (add1 line-idx))))) |
1 2 3 4 5 6 7 8 | #lang br (provide (struct-out end-program-signal) (struct-out change-line-signal) (struct-out line-error)) (struct end-program-signal ()) (struct change-line-signal (val)) (struct line-error (msg)) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #lang br (require "struct.rkt") (provide b-line raise-line-error) (define-macro (b-line NUM STATEMENT ...) (with-pattern ([LINE-NUM (prefix-id "line-" #'NUM #:source #'NUM)]) (syntax/loc caller-stx (define (LINE-NUM) (with-handlers ([line-error? (λ (le) (handle-line-error NUM le))]) (void) STATEMENT ...))))) (define (raise-line-error error-msg) (raise (line-error error-msg))) (define (handle-line-error num le) (error (format "error in line ~a: ~a" num (line-error-msg le)))) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #lang br (require "struct.rkt") (provide b-line raise-line-error) (define-macro (b-line NUM STATEMENT ...) (with-pattern ([LINE-NUM (prefix-id "line-" #'NUM #:source #'NUM)]) (syntax/loc caller-stx (define (LINE-NUM #:error [msg #f]) (with-handlers ([line-error? (λ (le) (handle-line-error NUM le))]) (when msg (raise-line-error msg)) STATEMENT ...))))) (define (raise-line-error error-msg) (raise (line-error error-msg))) (define (handle-line-error num le) (error (format "error in line ~a: ~a" num (line-error-msg le)))) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #lang br (require "line.rkt" "struct.rkt") (provide run) (define (run line-table) (define line-vec (list->vector (sort (hash-keys line-table) <))) (with-handlers ([end-program-signal? (λ (exn-val) (void))]) (for/fold ([line-idx 0]) ([i (in-naturals)] #:break (>= line-idx (vector-length line-vec))) (define line-num (vector-ref line-vec line-idx)) (define line-func (hash-ref line-table line-num)) (with-handlers ([change-line-signal? (λ (cls) (define clsv (change-line-signal-val cls)) (or (and (exact-positive-integer? clsv) (vector-member clsv line-vec)) (line-func #:error (format "line ~a not found" clsv))))]) (line-func) (add1 line-idx))))) |
1 2 3 4 5 6 7 8 | #lang br (provide (struct-out end-program-signal) (struct-out change-line-signal) (struct-out line-error)) (struct end-program-signal ()) (struct change-line-signal (val)) (struct line-error (msg)) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #lang br (require "struct.rkt") (provide b-line raise-line-error) (define-macro (b-line NUM STATEMENT ...) (with-pattern ([LINE-NUM (prefix-id "line-" #'NUM #:source #'NUM)]) (syntax/loc caller-stx (define (LINE-NUM #:error [msg #f]) (with-handlers ([line-error? (λ (le) (handle-line-error NUM le))]) (when msg (raise-line-error msg)) STATEMENT ...))))) (define (raise-line-error error-msg) (raise (line-error error-msg))) (define (handle-line-error num le) (error (format "error in line ~a: ~a" num (line-error-msg le)))) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #lang br (require "line.rkt" "struct.rkt") (provide run) (define (run line-table) (define line-vec (list->vector (sort (hash-keys line-table) <))) (with-handlers ([end-program-signal? (λ (exn-val) (void))]) (for/fold ([line-idx 0]) ([i (in-naturals)] #:break (>= line-idx (vector-length line-vec))) (define line-num (vector-ref line-vec line-idx)) (define line-func (hash-ref line-table line-num)) (with-handlers ([change-line-signal? (λ (cls) (define clsv (change-line-signal-val cls)) (or (and (exact-positive-integer? clsv) (vector-member clsv line-vec)) (line-func #:error (format "line ~a not found" clsv))))]) (line-func) (add1 line-idx))))) |