#lang br (provide #%module-begin #%top-interaction bf-program op loop) (module reader br (require "tokenizer.rkt" "parser.rkt" syntax/strip-context) (provide read-syntax) (define (read-syntax src-path src-port) (define src-exprs (list (parse src-path (tokenize src-port)))) ;; todo: why is `replace-context` necessary ; why does #'here work (replace-context #'here (inject-syntax ([#'( ...) src-exprs]) #'(module bf-interpreter br-bf ...))))) (define #'(bf-program ...) #'(begin ...)) (define-cases #'op [#'(_ ">") #'(move-pointer 1)] [#'(_ "<") #'(move-pointer -1)] [#'(_ "+") #'(set-pointer-byte! (add1 (get-pointer-byte)))] [#'(_ "-") #'(set-pointer-byte! (sub1 (get-pointer-byte)))] [#'(_ ".") #'(write-byte (get-pointer-byte))] [#'(_ ",") #'(set-pointer-byte! (read-byte))]) (define #'(loop "[" ... "]") #'(until (zero? (get-pointer-byte)) ...)) (define bf-vector (make-vector 1000 0)) (define bf-pointer 0) (define (get-pointer-byte) (vector-ref bf-vector bf-pointer)) (define (set-pointer-byte! val) (vector-set! bf-vector bf-pointer val)) (define (move-pointer how-far) (set! bf-pointer (+ bf-pointer how-far)))