#lang racket/gui (require "interpreter.rkt" framework) ; The editor width in pixels (define EDITOR-WIDTH 600) (define EDITOR-HEIGHT 600) ; The frame racket/gui base object for the editor (define f (new frame% [label "DrBrainf*ck"] [width EDITOR-WIDTH] [height EDITOR-HEIGHT])) ; execute-content: -> ProgState ; Returns the last state of execution of the program loaded in the editor (define (execute-content) (execute (program->prog-state (string->program (send editor get-flattened-text))))) ; The run button (define run-btn (new button% [parent f] [label "Run"] ; Callback procedure for a button click: [callback (lambda (button event) ; empty output text and set color to running (send run-output set-value "") (send run-output set-field-background run-col) ; run the program (define out (prog-state-output (execute-content))) ; set output and change color to ended (send run-output set-value out) (send run-output set-field-background end-col))])) (define c (new editor-canvas% [parent f])) ; The editor text object (define text-ln% (text:line-numbers-mixin (editor:standard-style-list-mixin text%))) (define editor (new text-ln%)) ; Show line numbers in editor (send editor show-line-numbers! #t) ; Change font to monospace 16 (send editor change-style (make-object style-delta% 'change-size 16)) (send editor change-style (make-object style-delta% 'change-family 'modern)) ; Running output color (define run-col (make-object color% 250 250 200)) ; Output completed color (define end-col (make-object color% 200 250 200)) (define mb (new menu-bar% [parent f])) (define m-file (new menu% [label "File"] [parent mb])) (define m-edit (new menu% [label "Edit"] [parent mb])) ; The run output text object (define run-output (new text-field% [style (list 'multiple 'vertical-label)] [label "Execution output:"] [parent f])) (define mi-open (new menu-item% [label "Open"] [parent m-file] [callback (lambda (i e) (define path (get-file #f f)) (when path (send editor load-file path 'text)))] [shortcut #\o] [shortcut-prefix '(ctl)])) (define mi-save (new menu-item% [label "Save"] [parent m-file] [callback (lambda (i e) (send editor save-file #f 'text))] [shortcut #\s] [shortcut-prefix '(ctl)])) (append-editor-operation-menu-items m-edit #f) (send editor set-max-undo-history 100) (send c set-editor editor) (send f show #t)