J-Bobを作ってみよう(1) quote、if
J-Bobといっても証明する方じゃなくて
j-bob-lang.scmで定義される方のやつです
証明する方のJ-Bobが動いて各種証明ができるレベルを目標とします
定理証明手習い、終わりのつもりだったんですけどこんなこと書いてあったの思い出しまして
読者のみなさんも、できれば好きな言語で J-Bob とその言語を実装してみてください。
Scheme手習いでもScheme修行でもインタプリタを実装しましたが
入力して動いてだいたいわかった、くらいのレベルで自分でイチから書いてみたことはありません
J-Bobは相当小さい言語なので初トライにはちょうどいいかなと思いまして
ゴールデンウィーク特別企画ということで!
本を見ないで書いてみる&便利なライブラリとか調べずに手持ちの武器で書く、という方針でいきます
最初は何か動いた感がほしいのでとりあえず一発目はquote
から
J-Bobは数字も必ずquote
されるので、生の値が突然コード中に出てくることはない・・・はず
クォーテーションマークをquote
に直すところはたぶんRacketが(というかread
が)
面倒見てくれるんじゃないかなと思ってます
関数名をeval
にするのはなんかこわいのでjeval
という名前に
#lang racket
(define (jeval e)
(cond ((eq? (car e) 'quote) (cadr e))))
動かす
> (jeval '(quote a))
'a
動きました
quote
しかない言語のできあがり
どこにquote
が必要でどこにつくのかちょっと混乱気味です
間違ってるかもしれませんが気づいたら直すということで
テストも書いておきます
(module+ test
(require rackunit)
(check-equal? (jeval '(quote a)) 'a)
)
次はもうちょっと複雑そうなif
やってみます
((eq? (car e) 'if)
(if (eq? (jeval (cadr e)) 'nil)
(jeval (cadddr e))
(jeval (caddr e))))
これくらいで動いてる気がします
(check-equal? (jeval '(if 't 'a 'b)) 'a)
(check-equal? (jeval '(if '1 'a 'b)) 'a)
(check-equal? (jeval '(if 'nil 'a 'b)) 'b)
大丈夫大丈夫