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)))))
変わらない
どうやら本腰を入れて調べないとダメっぽい