MinCamlの中の関数を対話環境から呼び出す
ocamlmktopコマンドを使うと、MinCamlの実行に必要なコードが読み込まれた OCaml の対話環境(OCaml トップレベルと呼ばれるらしい)をビルドすることができる。
9.5 カスタムトップレベルの作成: ocamlmktop
MinCamlをビルドすると min-caml.top という名前の OCaml トップレベルが作成されるので、それを実行することでMinCaml内の関数を対話的に呼び出すことができる。
min-caml.top を試してみる
min-caml.top を叩くと対話環境が立ち上がる。
code:sh
$ make clean && make && make min-caml
$ ./min-caml.top
Main.string を呼び出してコンパル結果を出力させてみる。
code:ocaml
# open Main;;
# string "let rec fib n = if n <= 2 then 1 else (fib (n - 2)) + (fib (n - 1)) in print_int (fib 10)";;
free variable print_int assumed as external
iteration 1000
iteration 999
directly applying fib.10
directly applying fib.10
directly applying fib.10
eliminating closure(s) fib.10
register allocation: may take some time (up to a few minutes, depending on the size of functions)
generating assembly...
.text
.globl _min_caml_start
.align 2
fib.10:
cmpwi cr7, r2, 2
bgt cr7, ble_else.24
li r2, 1
blr
ble_else.24:
subi r5, r2, 2
stw r2, 0(r3)
mflr r31
mr r2, r5
stw r31, 4(r3)
addi r3, r3, 8
bl fib.10
subi r3, r3, 8
lwz r31, 4(r3)
mtlr r31
lwz r5, 0(r3)
subi r5, r5, 1
stw r2, 4(r3)
mflr r31
mr r2, r5
stw r31, 12(r3)
addi r3, r3, 16
bl fib.10
subi r3, r3, 16
lwz r31, 12(r3)
mtlr r31
lwz r5, 4(r3)
add r2, r5, r2
blr
_min_caml_start: # main entry point
mflr r0
stmw r30, -8(r1)
stw r0, 8(r1)
stwu r1, -96(r1)
# main program starts
li r2, 10
mflr r31
stw r31, 4(r3)
addi r3, r3, 8
bl fib.10
subi r3, r3, 8
lwz r31, 4(r3)
mtlr r31
mflr r31
stw r31, 4(r3)
addi r3, r3, 8
bl min_caml_print_int
subi r3, r3, 8
lwz r31, 4(r3)
mtlr r31
# main program ends
lwz r1, 0(r1)
lwz r0, 8(r1)
mtlr r0
lmw r30, -8(r1)
blr
- : unit = ()
参考
9.5 カスタムトップレベルの作成: ocamlmktop