Work on asynchronous version of execute

This commit is contained in:
Claudio Maggioni 2018-12-04 10:08:09 +01:00
parent 45ba1c924a
commit a380b3d421
3 changed files with 1198 additions and 16 deletions

1182
#gui.rkt#1# Normal file

File diff suppressed because it is too large Load diff

View file

@ -94,7 +94,7 @@
[else 'comment])) [else 'comment]))
(values 1str bf-token #f (+ pos) (+ pos 1))])) (values 1str bf-token #f (+ pos) (+ pos 1))]))
; Syntax highlighting for brainf*ck[(symbol=? token 'loop) "Loop"] ; Syntax highlighting for brainf*ck
(send editor start-colorer bf-token->bf-style bf-lexer '()) (send editor start-colorer bf-token->bf-style bf-lexer '())
; Define basic style for instructions (+ - , .) ; Define basic style for instructions (+ - , .)

View file

@ -313,23 +313,23 @@
(prog-state '(1) 0 1 "" "[++--]++--+-[]" 5)) (prog-state '(1) 0 1 "" "[++--]++--+-[]" 5))
(prog-state '(1) 0 1 "" "[++--]++--+-[]" 1)) (prog-state '(1) 0 1 "" "[++--]++--+-[]" 1))
; execute: ProgState -> ProgState ; execute: ProgState ((ProgState) -> Any) -> ProgState
; Given an initial ProgState state, returns the final ProgState state executing the ; Given an initial ProgState state, calls done when the final ProgState is ready
; program. ; to execute the program.
(define (execute w) (define (execute w done)
(local [(define program-len (string-length (prog-state-program w)))] (local [(define program-len (string-length (prog-state-program w)))]
(cond [(>= (prog-state-ip w) program-len) w] (cond [(>= (prog-state-ip w) program-len) (done w)]
[else
(define inst (char-at (prog-state-program w) (prog-state-ip w)))
(cond [(string=? inst ",") (exec-in w (lambd]
[else [else
(local [(define inst
(char-at (prog-state-program w) (prog-state-ip w)))]
(execute (cond [(string=? inst "+") (exec-add1 w)] (execute (cond [(string=? inst "+") (exec-add1 w)]
[(string=? inst "-") (exec-sub1 w)] [(string=? inst "-") (exec-sub1 w)]
[(string=? inst "<") (exec-tape-left w)] [(string=? inst "<") (exec-tape-left w)]
[(string=? inst ">") (exec-tape-right w)] [(string=? inst ">") (exec-tape-right w)]
[(string=? inst "[") (exec-loop-start w)] [(string=? inst "[") (exec-loop-start w)]
[(string=? inst "]") (exec-loop-end w)] [(string=? inst "]") (exec-loop-end w)]
[(string=? inst ".") (exec-out w)] [(string=? inst ".") (exec-out w)]) done)])])))
[(string=? inst ",") #f])))])))
; Tests for execute ; Tests for execute
(check-expect (execute (prog-state (list 0) 0 3 "" "" 0)) (check-expect (execute (prog-state (list 0) 0 3 "" "" 0))