kb84tkhrのブログ

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

J-Bobを作ってみよう(4) load

えーとあとは
ファイルから読めるようにしたらいいのか

どうするのがスマート?
J-Bobにloadつけるのかな
それともJ-Bobの外に作るのがいいだろうか
いったん外で使うのを作って、その後J-Bobに入れよう
文字列型もないけど
きっとreadならなんとかしてくれる

さて
Racketでファイル入出力すらやったことがないことに気づいてリファレンスを見るなど

こうか

(define (jload filename)
  (call-with-input-file filename
    (λ (in)
      (let loop ((e (read in)))
        (cond ((equal? e eof) (void))
              (else (printf "~a~n" (jeval e))
                    (loop (read in))))))))

set-add-atoms.jbbっていうファイルにさっきのを保存して、と

>> (jload "set-add-atoms.jbb")
#<void>
#<void>
#<void>
#<void>
(a c () b)
t

いけてる
op1に組み込み関数を追加

(define op1s '(car cdr atom natp size load))

(define (op1 op arg)
:
    ((eq? op 'load) (jload arg))
:

さて

> (repl)
>> (load "set-add-atoms.jbb")
car: contract violation
  expected: pair?
  given: "set-add-atoms.jbb"

何が?

ああ
J-Bobだから生のリテラルはないんだ

こういう書き方はアリなのか?

>> (load '"set-add-atoms.jbb")
#<void>
#<void>
#<void>
#<void>
(a c () b)
t
#<void>

あった

ということはですよ

>> (load '"j-bob.scm")
#<void>
#<void>
  :
#<void>
#<void>
: 

読めた

もしかしてこれで証明も動くのか・・・?

>> (J-Bob/step (prelude)
     '(car (cons 'ham '(eggs)))
     '(((1) (cons 'ham '(eggs)))
     (() (car '(ham eggs)))))

長い
帰ってこない
これはさすがに何かおかしい?

インタプリタで動いてるってことはないとは思うけど
試しにコンパイルしてコマンドラインから実行してみよう
実行したらREPLが動くようにしておかないといけないかな

eofを覚えたのでreplももう少しマトモに終われるようにしておきます

(define (repl)
  (let loop ()
    (printf ">> ")
    (let ((e (read)))
      (cond ((equal? e eof) (void))
            (else 
             (printf "~a~n" (jeval e))
             (loop))))))

(repl)

動かす

[my-j-bob-lang][jbob-lang *%]$ ./jbob
>> (cons 'a 'b)
(a . b)
>> 

できてる
本番

[my-j-bob-lang][jbob-lang *%]$ ./jbob
>> (load '"j-bob.scm")
#<void>
>> (J-Bob/step (prelude) '(car (cons 'ham '(eggs))) '(((1) (cons 'ham '(eggs))) (() (car '(ham eggs)))))

変わらない
どうやら本腰を入れて調べないとダメっぽい