osiire’s blog

ふしぎなそふとやさん

run-camlしなイカ?

このエントリーはhttp://partake.in/events/5784afd8-d43b-4cbe-9256-430d5ababa2bへの参加記事でゲソ!一年前経つのは早いじゃなイカ。

run-camlを知っているでゲソ?run-camlはOCamlに標準装備されているcaml-modeの機能の一つで、emacs上でtoplevelを動かしてくれる優れモノでゲソ。今日はこのrun-camlで侵略を加速する方法を紹介しようじゃなイカ!

まずOCamlとcaml.elをインストールするでゲソ。Debian系なら、

$ sudo apt-get install ocaml ocaml-mode

で入るでゲソ。準備ができたらemacsで最低限の設定を記述して評価しておくでゲソ。

(if window-system (require 'caml-font))
(setq auto-mode-alist
(cons '("\\.ml[iylp]?$" . caml-mode) auto-mode-alist))
(autoload 'caml-mode "caml" "Major mode for editing Caml code." t)
(autoload 'run-caml "inf-caml" "Run an inferior Caml process." t)
(setq inferior-caml-program "ocaml -I +threads -I +camlp4")

簡単じゃなイカ?
じゃぁ例えば、次のようなHello Worldプログラムをhello.mlとして書いていたとするでゲソ。

let hello person =
  print_string ("hello " ^ person)

この時に、M-x run-camlすると下段バッファにtoplevelが開くでゲソ。

この状態でプログラムを範囲選択し、Ctrl-c Ctrl-rすると選択された範囲がtoplevel上で評価されるでゲソ。

toplevelを生で使っていると式の度に;;が無いとうまく評価されない問題が発生するけど、run-caml経由なら複数の式を一気に評価してもよろしくやってくれるでゲソ。hello関数を使ってみようじゃなイカ。

ちゃんと使えるでゲソ。#の直後にカーソルを置けばCtl-↑でヒストリーも出てくるでゲソ。これでちょっとしたプログラムならサクサク試しながら作れるじゃなイカ?

でも、これだけじゃぁ実際には足りないでゲソ。実際の開発では色々なライブラリや自前関数を使いながらプログラムするので、単純に実行したい行を評価しても未定義の関数があると言われてしまうでゲソ。

そういう時のために、toplevelには#loadディレクティブが用意されているでゲソ。toplevel上で、#load "使いたいライブラリ.cma";;とすると、所望のライブラリをtoplevel環境にロードできるでゲソ。camlimagesライブラリをロードしておけば、プログラムを動的に評価しながらグラフィックを描画する事も可能でゲソ。@yoshihiro503のOCamltterだってemacs上で動くでゲソ。pa_monadを使いたい人も#load "pa_moand.cmo"とすると拡張構文が使えるでゲソ。

毎回#loadディレクティブを実行するのが面倒なら、#loadディレクティブを列挙した.ocamlinitファイルをホームディレクトリに作っておけば、toplevelが立ち上がる時に自動的にロードされるでゲソ。ちなみにイカは私が使っている.ocamlinit。

#load "dynlink.cma"
#load "camlp4orf.cma"
#load "unix.cma"
#load "threads.cma"
#load "str.cma"
#load "graphics.cma"
#load "camlimages_core.cma"
#load "camlimages_all.cma"
#load "camlimages_graphics.cma"

さらに豆知識でゲソ。trampというssh経由でファイルやシェルを扱えるelispと一緒に使えば、リモート上の.mlファイルをssh経由で編集しながら、run-camlでリモート上のtoplevelを起動して開発ができるでゲソ。開発機がローカルVMじゃない時には必須のテクニックでゲソ。

さあ、みんなもrun-camlで侵略を開始するでゲソ!