no title added by anonymous on Thu Aug 8 22:14:32 2013

(use srfi-1)
(use extras)
(use utils)

(define vm (make-vector 500 0))
(define ptr 0)
(define pc 0)

(define (main)
  (let* ([port (open-input-file (last (argv)))]
         [data (read-all port)]
         [char (string-ref data pc)])
    (cond
      [(char=? char #\>) (set! ptr (add1 ptr))]
      [(char=? char #\<) (set! ptr (sub1 ptr))]
      [(char=? char #\+) (vector-set! vm ptr (add1 (vector-ref vm ptr)))]
      [(char=? char #\-) (vector-set! vm ptr (sub1 (vector-ref vm ptr)))]
      [(char=? char #\.) (write-byte (vector-ref vm ptr))]
      [(char=? char #\,) (vector-set! vm ptr (read-byte))]
      [(char=? char #\[) (begin
                           (if (= (vector-ref vm ptr) 0)
                             (let* ([j 1] [loop (lambda ()
                                                  (cond
                                                    [(char=? (string-ref data (add1 pc)) #\[) (set! j (add1 j))]
                                                    [(char=? (string-ref data (add1 pc)) #\]) (set! j (sub1 j))]))])
                               (if (> j 0) (begin
                                             (loop)
                                             (set! pc (add1 pc)))))))]
      [(char=? char #\]) (begin
                           (if (not (= (vector-ref vm ptr) 0))
                             (let* ([j -1] [loop (lambda ()
                                                   (cond
                                                     [(char=? (string-ref data (sub1 pc)) #\[) (set! j (add1 j))]
                                                     [(char=? (string-ref data (sub1 pc)) #\]) (set! j (sub1 j))]))])
                               (if (< j 0) (begin
                                             (loop)
                                             (set! pc (sub1 pc)))))))])
    (set! pc (add1 pc))
    (close-input-port port)
    (if (not (= (string-length data) pc)) (main))))

(main)