kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

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)

大丈夫大丈夫