You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
beautiful-racket/br-bf/main.rkt

35 lines
1.3 KiB
Racket

#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-expr> ...) src-exprs])
#'(module bf-interpreter br-bf
<src-expr> ...)))))
(define #'(bf-program <op-or-loop> ...)
#'(begin <op-or-loop> ...))
(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 "[" <op-or-loop> ... "]")
#'(until (zero? (get-pointer-byte))
<op-or-loop> ...))
(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)))