imenuをつかった簡単OCaml on Emacs関数ジャンプレシピ

imenu.elで、関数定義にジャンプ - Happy OCaml!! - ocaml-nagoyaグループ
imenu.el の使い方と応用 — ありえるえりあ
巷で話題の anything.el を使ってみた — ありえるえりあ
2007-07-25

参考文献の先が詳しいですが…。

とにかくEmacs詳しくないけどOCamlの関数定義をジャンプさせたいだけなんだ!っていう人はこうしてくださいな。

  1. imenu

imenuは多分最初から入ってるのでok.

  1. tuareg-imenu

tuareg-imenu(http://caml.inria.fr/cgi-bin/hump.en.cgi?contrib=76)をダウンロードしてload-pathのところに配置。
.emacsには

;tuareg-imenu
(autoload 'tuareg-imenu-set-imenu "tuareg-imenu" "Configuration of imenu for tuareg" t)
(add-hook 'tuareg-mode-hook 'tuareg-imenu-set-imenu)

を追記。

  1. anything

anythingは
http://www.emacswiki.org/cgi-bin/wiki/download/anything.el
http://www.emacswiki.org/cgi-bin/wiki/download/anything-config.el
からダウンロードして配置。emacs-lispのバイトコンパイルをしてね!

.emacsには

;anything
(require 'anything-config)

(setq anything-sources (list anything-c-source-buffers
anything-c-source-bookmarks
anything-c-source-imenu
;;anything-c-source-recentf
anything-c-source-file-name-history
anything-c-source-locate
anything-c-source-complex-command-history)
)

(global-set-key "\C-f" 'anything)

を追記。
ちなみにanythingの呼び出しは

(global-set-key "\C-f" 'anything)

のようにC-fに割り当ててある(C-fで移動とかしない人なのでつぶしましちゃいました)。自由に変更してくださいな。
anything-c-source-imenuっていうのがimenuをanythingのsource(検索対象)に入れる関数。これを登録してある。
これもうこのままで動くはず。
Meadowだとなぜかanythingにimenuが表示されるときとされないときがある。
どうも開いたら一回M-x imenuで何か関数にジャンプしないといけないみたいだ。ちょっと面倒だけど、あまりある便利さの前にこのぐらいなんでもないっすよ!

ちなみにimenuっていうのは
関数の名前っぽいものを全体からスキャンしてストアしといててくれる。入力した関数名のところに一発ジャンプ、という優れものelisp
anythingっていうのは要は自動補完。でも何から何まで全部自動補完の対象になるとても便利なelisp。これの自動補完の対象にimenuの候補を加えればリストから選んで関数にジャンプできる(インクリメンタルサーチも出来る)。便利すぎる。

Baidu Type 使ってみた:ファーストインプレッション

今この文章はGoogleIMEを使って入力してます.
なんでかっていうとこんな感じだから.

使ってみた感想としては

  1. スキン機能は本当にびっくりするくらいいらない.


  1. なんでかっていうと,日本語キーボードに対応してないみたいだから.
  2. だもんで,日本語モードに切り替えるのにツールバーを使うほかない.なんてこったい.
  3. 変換はどうなんだろう.

GoogleIMEと比べてみます.
どっちも変換キー一発勝負.

  • 普通の単語

国家安全保障局

G:国家安全保障局
B:国家安全保障局

「米金融規制案発表」

G:米金融規制案発表
B:米金融規制案発表

「シカゴ・オプション取引所のボラティリティー・インデックス」

G:シカゴ・オプション取引所のボラティリティー・インデックス
B:シカゴ・オプション取引所のボラティリティー・インデックス

ちなみに上の文章はBaiduTypeではインデックスの最後のuが入力限界に達したため入力できなかったので,インデックスだけを区切って変換した.
これを見ると,単語変換精度に違いはないように思える.

  • 普通の文章

「欧州のソブリン債をめぐる懸念が高まっていることや、米新規失業保険申請件数が予想外に増加したことを受けて警戒感が広がった。」

G:欧州のソブリン債をめぐる懸念が高まっていることや,米新規失業保険申請件数が予想外に増加したことを受けて警戒感が広がった.
B:欧州のソブリン歳をめぐる懸念が高まっていることや、米新規失業保険申請件数が予想外に増加したことを受けて軽快感が広がった。

「レベリング氏が「あなたのモチベーションとは何ですか」と質問をすると、ある営業マンは「私は社長を男にしたいと思っています」と発言。」

G:れべリング氏が「あなたのモチベーションとはなんですか」と質問をすると、ある営業マンは「私は社長を男にしたいと思っています」と発言。
B:レベリング滋賀「あなたのモチベーションとは何ですか」と質問をすると、ある営業マンは「私は社長を男にしたいと思っています」と発言。

ここでだいぶ差がついてきた感じがする.
ちなみにみんなが馬鹿にするMS-IME(のTrigramのやつ)を試してみると
MSIME:欧州のそぶりン祭をめぐる懸念が高まっていることや、米新規失業保険申請件数が予想外に増加したことを受けて警戒感が広がった。
MSIME:れべリング氏が「あなたのモチベーションとはなんですか」と質問をすると、ある営業マンは「私は社長を男にしたいと思っています」と発言。

うーん、MS-IMEは辞書が弱いんだな.

ともあれ、Baidu TypeとGoogle IMEの差は歴然で,警戒感と軽快感とか,ソブリン債みたいな単語のデータ量の差のような気もするところから,レべリング氏がと滋賀みたいな明らかに品詞選択を間違っているところもある.GoogleIME素晴らしい.
MS-IME…もうちょっと辞書頑張れ.

最後に

アスキー・メディアワークスが4月1日に発売を予定している期待のPSP新作ギャルゲー『マリッジロワイヤル / プリズムストーリー』。全国から集まったプレイヤー(主人公)のお嫁さん候補たち12人と交流を深め、最終的にひとりのお嫁さんを決定することになる。
(中略)
実はこのゲーム、登場する12人の美少女たちの顔がみんな同じに見えるとインターネット上で話題になっているのだ。確かに、12人の美少女たちはみんな同じ顔をしている。」

G:アスキー・メディアワークスが4月1日に発売を予定している機体のPSP新作ギャルゲー「マリッジロワイヤル・プリズムストーリー」.全国から集まったプレイヤー(主人公)のお嫁さん候補たち12人と交流を深め,最終的にひとりのお嫁さんを決定することになる.
(中略)
実はこのゲーム,登場する12人に美少女たちの顔がみんな同じに見えるとインターネット上で話題に鳴っているのだ.確かに,12人の美少女たちはみんな同じ顔をしている.
B:アスキー・メディアワークスが4月1日に発売を予定している期待のPSP新作ギャルゲー「マリッジロワイヤル・プリズムストーリー」。)全国から集まったプレイヤー(主人公のお嫁さん候補たち12人と交流を深め、最終的に一人のお嫁さんを決定することになる。
)(中略
実はこのゲーム、登場する12人の美少女たちの顔が皆同じに見えるとインターネット上で話題になっているのだ。確かに、12人の美少女たちは皆同じ顔をしている。

なんと、最後の結果では全体的にBaidu Typeの方が良好だ.Google IMEの話題に鳴っているが致命的な変換ミスと言えよう.
ともあれ、BaiduTypeは今は英語キーボードになってしまう上,閉じカッコ’)’をうつと何故か,直接入力になってしまう(上の括弧の対応が変なのはそのせい).なので実用に耐えるかどうかは微妙.

もうちょっとちゃんと使えるようになったら,意外に使えるかもしれない気がする.
ともあれ、今の段階だとネタだな,完全に.

OMakeを使ってOcamlのファイルをビルド!

やっとまともな開発環境ができた!

今の開発環境はon Windows
OCaml for windows + Meadow + tuareg-mode + omake
という感じ。
どんな感じかっていうと

  1. meadowでmlファイルを書く
  2. その場でC-c, C-eで評価して文法や型の確認とテストケースの実行。これで単体テストは完了。
  3. そのあとOMake使ってバイナリのビルドと結合テスト

という感じ。

やっと理解できた。OMakeすばらしい!
OMakeは
omake: OCamlフレンドリーな超強力ビルド ツール - camlspotter’s blog

2009-09-23
とか
OMakeでのコンパイル@ocaml-tutorial日本語版
にあるとおりそのままでほぼ大丈夫。

ただ、Meadowで書いているときに他のファイルのモジュールとかを読まなきゃいけない。
方法は二つ

  • そのファイルを開いてC-c, C-b(ファイル全体の評価)する
  • #use書いて、その行を評価する

で、もちろん上の方法はあほみたいなので、下の方法を使うと。
そうするともちろんocamlcとかocamloptのコンパイラに怒られる。
そこで、

sed "/^#/d"

としておくと、#から始まるインタプリタコマンド行を消してくれる。
これをプリプロセスとするためにOMakeのOCAMLPPFLAGSに

OCAMLPPFLAGS = -pp 'sed "/^#/d"'

を足しておく。
Windowsでネイティブコンパイルしたいので、コマンドプロンプト

>"C:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"

を実行する。
PATHにリンカとかflexlinkの実行ファイルの場所を追加して、さあいよいよOMake!

omake

ものぐさな性格なので、warningがいっぱい出る。たいていパターンマッチのexhaustive warning.というわけで、warningがあるとコンパイルできない(-warn-error)ので、warningを全部直して、(あり得ないパターンマッチで例外をはくようにちゃんと書いた…ちゃん取っていうか知らないけど)再度omake。
今度はちゃんと動く。感動。
これで一発ビルド環境ができた。うーん。モダンだ。
ひとまず動いたところまで、あとで詳しく書きますー。

OCamlでTrie

Trieを書いた。パフォーマンスはあんまりよくない…。
再帰呼び出しのスタック消費をなるべく抑えるように書いたけど、残念ながら末尾再帰にできなかった…。これ以上時間をかけられないのでこれでおしまい。
パフォーマンスは
Core2Duo T5600 1.83GHzで
1000 : 0.187000 sec
10000: 20.485000 sec
18000: 68.437000 sec
うーん。遅いなあ。
とりあえず、ターゲットにしているスケールでまあ我慢できる時間で動くことはわかったので、後に回そう。
再帰構造のretrievalを末尾再帰に(機械的に)直す方法ってあるのかなあ…。

# let trobj = TriTrie.add_list [] (headn t 100);;
val trobj : (int, int * int * int * int * int) Trie.trie list =
  [Node (103,
    [Node (74, [Leaf (102, (100, 102, 103, 74, 1))]);
     Node (100, [Leaf (101, (98, 100, 101, 103, 1))]);
     Node (73, [Leaf (102, (99, 73, 102, 103, 1))])]);
   Node (101,
    [Node (103, [Leaf (100, (98, 100, 101, 103, 1))]);
     Node (99, [Leaf (98, (96, 99, 98, 101, 1))]);
     Node (102, [Leaf (100, (97, 102, 100, 101, 1))])]);
   Node (99,
    [Node (97,
      [Leaf (98, (93, 98, 99, 97, 1)); Leaf (96, (94, 99, 97, 96, 1))]);
     Node (98,
      [Leaf (100, (95, 100, 99, 98, 1)); Leaf (101, (96, 99, 98, 101, 1))])]);
   Node (97,
    [Node (96, [Leaf (99, (94, 99, 97, 96, 1))]);
     Node (95,
      [Leaf (96, (91, 96, 97, 95, 1)); Leaf (94, (92, 97, 95, 94, 1))]);
     Node (98, [Leaf (99, (93, 98, 99, 97, 1))])]);
   Node (95,
    [Node (94, [Leaf (97, (92, 97, 95, 94, 1))]);
     Node (93,
      [Leaf (94, (89, 94, 95, 93, 1)); Leaf (92, (90, 95, 93, 92, 1))]);
     Node (96, [Leaf (97, (91, 96, 97, 95, 1))])]);
   Node (93,
    [Node (92, [Leaf (95, (90, 95, 93, 92, 1))]);
     Node (91,
      [Leaf (92, (87, 92, 93, 91, 1)); Leaf (90, (88, 93, 91, 90, 1))]);
     Node (94, [Leaf (95, (89, 94, 95, 93, 1))])]);
   Node (91,
    [Node (90, [Leaf (93, (88, 93, 91, 90, 1))]);
     Node (89,
      [Leaf (90, (85, 90, 91, 89, 1)); Leaf (88, (86, 91, 89, 88, 1))]);
     Node (92, [Leaf (93, (87, 92, 93, 91, 1))])]);
   Node (89, [Node (88, [Leaf (91, (86, ...)); ...]); ...]); ...]

Go言語さわってみた

Ubuntu 9.10にインストールしてちょこっと触ってみた。
以下メモとリンク。
インストールは
http://nosue.blogsite.org/archives/dev/debian/212
を参照。
ターゲットCPUはamd64

ほぼ問題なくインストール完了。Anthyの日本語変換バカ過ぎてマジ使えない。

Emacsでサンプルコードを実行してみる。

#6g test.go
#6l test.6
#./6.out

でバイナリが出来上がる。6gとか6lはamd64向け。5はamdで8はx86らしい。

次に欲しいのがEmacsの編集モード

http://six-pence.blogspot.com/2009/11/goemacs-google-go-emacs-major-mode-go.html
を参考にしつつ...

ln -s ${GOROOT}/misc/emacs/*.el ~/.emacs.d/site-lisp/go-mode/

go-modeのelispをsite-lisp以下にリンク。
で、.emacs

;================================================================
; Go
;================================================================
(require 'go-mode-load)

を追加。
で、

~/.emacs.d/site-lisp/go-mode/

にload-pathが通っていなかったので.emacsにさらに

(defconst my-elisp-directory "~/.emacs.d/site-lisp/" "The directory for my elisp file.")

(dolist (dir (let *1
(let *2
(setq load-path (cons default-directory load-path))
(normal-top-level-add-subdirs-to-load-path))))

これで、~/.emacs.d/site-lisp/以下のディレクトリが再帰的にload-pathに含まれるようになる(Emacs講座 -第6回- load-path / マスタカの ChangeLog メモを参考にしました)。
これでgo-modeで編集できるー!

つづく
つづきは「makefileを出力するmakemakerでコンパイルを一発で」の巻の予定。

*1:dir (expand-file-name my-elisp-directory))) (list dir (format "%s%d" dir emacs-major-version)))) (when (and (stringp dir) (file-directory-p dir

*2:default-directory dir