読者です 読者をやめる 読者になる 読者になる

ocamlのtoplevelで手軽にcoreを使う方法

ocamlのtoplevelで手軽にcoreを使う方法

core に色々なモジュールが定義されている。 これらを試すために毎回実行ファイルを作成するのもだるかったのでtoplevelから使えないか調べてみた。

例えばemacsのtuareg-mode上立ち上げたtoplevelなどで使っている。

以下の様にすると出来る。

#use "topfind";;
#require "core_kernel";;
open Core_kernel.Std;;

読み込めるpackageを調べるには"#list"を使っても良いしocamlfind -list | grep <package>とかしても良い。

テキトウに試してみた結果。

List.iterCore_kernel.Std.List.iterに置き換わっていることを確認して、何かてきとうな関数を作ってみる。

ocaml
        OCaml version 4.02.1

# #use "topfind";;
#use "topfind";;
- : unit = ()
Findlib has been successfully loaded. Additional directives:
  #require "package";;      to load a package
  #list;;                   to list the available packages
  #camlp4o;;                to load camlp4 (standard syntax)
  #camlp4r;;                to load camlp4 (revised syntax)
  #predicates "p,q,...";;   to set these predicates
  Topfind.reset();;         to force that packages will be reloaded
  #thread;;                 to enable threads

- : unit = ()
# #require "core_kernel";;
#require "core_kernel";;
~/.opam/4.02.1/lib/ocaml/unix.cma: loaded
~/.opam/4.02.1/lib/ocaml/bigarray.cma: loaded
~/.opam/4.02.1/lib/bin_prot: added to search path
~/.opam/4.02.1/lib/bin_prot/bin_prot.cma: loaded
~/.opam/4.02.1/lib/custom_printf: added to search path
~/.opam/4.02.1/lib/custom_printf/custom_printf.cma: loaded
~/.opam/4.02.1/lib/variantslib: added to search path
~/.opam/4.02.1/lib/variantslib/variantslib.cma: loaded
~/.opam/4.02.1/lib/sexplib: added to search path
~/.opam/4.02.1/lib/sexplib/sexplib.cma: loaded
~/.opam/4.02.1/lib/enumerate: added to search path
~/.opam/4.02.1/lib/fieldslib: added to search path
~/.opam/4.02.1/lib/fieldslib/fieldslib.cma: loaded
~/.opam/4.02.1/lib/pa_bench: added to search path
~/.opam/4.02.1/lib/pa_bench/pa_bench_lib.cma: loaded
~/.opam/4.02.1/lib/oUnit: added to search path
~/.opam/4.02.1/lib/oUnit/oUnitAdvanced.cma: loaded
~/.opam/4.02.1/lib/oUnit/oUnit.cma: loaded
~/.opam/4.02.1/lib/pa_ounit: added to search path
~/.opam/4.02.1/lib/pa_ounit/pa_ounit_lib.cma: loaded
~/.opam/4.02.1/lib/pa_test: added to search path
~/.opam/4.02.1/lib/pa_test/pa_test_lib.cma: loaded
~/.opam/4.02.1/lib/typerep_lib: added to search path
~/.opam/4.02.1/lib/typerep_lib/typerep_lib.cma: loaded
~/.opam/4.02.1/lib/core_kernel: added to search path
~/.opam/4.02.1/lib/core_kernel/core_kernel.cma: loaded
# open Core_kernel.Std;;
open Core_kernel.Std;;
# List.iter;;
List.iter;;
- : 'a Core_kernel.Std.List.t -> f:('a -> unit) -> unit = <fun>
# let main () =
  let xs = [1;2;3]
  in
  List.iter ~f:(fun x -> x |> string_of_int |> print_string) xs
;;
let main () =
  let xs = [1;2;3]
  in
  List.iter ~f:(fun x -> x |> string_of_int |> print_string) xs
;;
        val main : unit -> unit = <fun>
# main();;
main();;
123- : unit = ()

参考

追記

-initオプションで初期化時に読み込むファイルを指定できるらしい。

以下のようなocaml-toplevelというコマンドを作った。

~/bin/ocaml-toplevel

#!/bin/sh

eval `opam config env`
if [ -f ~/.ocamlrc ]; then
  ocaml -init ~/.ocamlrc
else
  ocaml
fi

.ocamlrc

#use "topfind";;
#require "core_kernel";;
open Core_kernel.Std;;

tuareg-modeの指定を以下の様にした。

(when (executable-find "ocaml-toplevel")
  (setq tuareg-interactive-program "ocaml-toplevel"))