REPLについての補足

REPLのバックエンドで実行されるocaml toplevelは特に指定しなかった場合は
PATHの通った「ocaml」コマンドになります。
もしPATHが通ってない場合や、複数の「ocaml」がインストールされていて任意ものを
使いたい場合はコマンドラインオプションで指定してください。
たとえばocamlコマンドが「/opt/bin/ocaml」にある場合は以下のように指定します。
rlwrap gosh s_exp_ocaml.scm --ocaml=/opt/bin/ocaml


コンパイル済みファイル(cmo, cma)の読み込み
「(ocaml コード)」の形式で、コードを変換無しにそのままOCamlコードとして実行しますが、
コンパイラには無いOCaml top_levelの各機能についても同様に「(ocaml コード)」の形式になります。
たとえばREPL上で「unix.cma」を読み込んでsystem関数を呼び出す場合は以下のようになります。
# (ocaml "#load \"unix.cma\"")
#load "unix.cma";;

# (Unix.system "ls")
(Unix.system
"ls");;

~省略~

# 


REPL上からソースファイルの読み込み
S式OCamlファイルの読み込みは、ソースファイルに記述する際と同様にREPL上でも
「(require ファイル名)」です。
またマクロもREPL上で定義可能です。
以下の例では1行目で「common.scm」を読み込み、2行目で角カッコで数値を囲むと、「common.scm」内で定義された
「list-int」マクロを展開するリーダーマクロを定義しています。
# (require "common.scm")
# (set-macro-character #\[ (lambda (p char) `(list-int ,@(read-delimited-list p #\])) ))
# [0 2 .. 20]
(if ((0) < (2)) then (CommonFunctions.list_range
(0)
(20)
((2) - (0))) else (CommonFunctions.list_range_down
(0)
(20)
((0) - (2))));;

- : int list = [0; 2; 4; 6; 8; 10; 12; 14; 16; 18; 20]
# 
上記の例の結果は「0から20までの偶数のlist」になります。