読者です 読者をやめる 読者になる 読者になる

きくらげ観察日記

好きなことを、適当に。

Ook!はSchemeである

Gauche

Ook!のソースも、括弧で括ればただのS式ですよね。

;; ook.scm

(define *mem-size* 10000)
(define *mem* (make-vector *mem-size* 0))
(define *ptr* 0)
(define (inc-ptr!) (inc! *ptr*))
(define (dec-ptr!) (dec! *ptr*))
(define (inc-mem!) (inc! (~ *mem* *ptr*)))
(define (dec-mem!) (dec! (~ *mem* *ptr*)))
(define (read-mem) (set! (~ *mem* *ptr*) (read-char)))
(define (write-mem) (write-char (integer->char (~ *mem* *ptr*))))
(define (get-mem) (~ *mem* *ptr*))

(define-syntax Ook!-next
  (syntax-rules (Ook. Ook! Ook?)
    ((_ () Ook? Ook! rest ...) (Ook! rest ...))
    ((_ (() . lev) Ook? Ook! rest ...) (Ook!-next lev rest ...))
    ((_ lev Ook! Ook? rest ...) (Ook!-next (() . lev) rest ...))
    ((_ lev ook. ook! rest ...) (Ook!-next lev rest ...))))

(define-syntax Ook!
  (syntax-rules (Ook. Ook! Ook?)
    ((_) #t)
    ((_ Ook. Ook? rest ...) (begin (inc-ptr!) (Ook! rest ...)))
    ((_ Ook? Ook. rest ...) (begin (dec-ptr!) (Ook! rest ...)))
    ((_ Ook. Ook. rest ...) (begin (inc-mem!) (Ook! rest ...)))
    ((_ Ook! Ook! rest ...) (begin (dec-mem!) (Ook! rest ...)))
    ((_ Ook. Ook! rest ...) (begin (read-mem) (Ook! rest ...)))
    ((_ Ook! Ook. rest ...) (begin (write-mem) (Ook! rest ...)))
    ((_ Ook! Ook? rest ...)
     (let loop ()
       (if (= (get-mem) 0)
           (Ook!-next () rest ...)
           (begin
             (Ook! rest ...)
             (loop)))))
    ((_ Ook? Ook! rest ...) #t)))


(Ook!
 Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
 Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook. Ook?
 Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
 Ook. Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
 Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
 Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook.
 Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook! Ook! Ook? Ook!
 Ook. Ook? Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook? Ook. Ook.
 Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
 Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook. Ook. Ook. Ook. Ook.
 Ook. Ook. Ook! Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook! Ook.
 Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
 Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
 Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook.
 Ook. Ook? Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook.
 Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
 Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
 Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook. Ook? Ook. Ook.
 Ook! Ook. Ook. Ook? Ook! Ook.)

実行結果:

$ gosh ./ook.scm
Hello World!

おわり。