R6RS

2010年01月18日

higeponさんから始まったコードバトン、のSchemeブランチ(というか本流)がkazu634さんから回ってきた。

コードがmoshべったりになってるので、とりあえずmoshで動かしてみるか。

と思ったらこのマシンにはmoshが入っていない。

HEADを入れるにしてもmosh-0.2.0が要るみたいなので0.2.0を貰ってきて

$ ./configure
checking build system type... i386-apple-darwin10.2.0
checking host system type... i386-apple-darwin10.2.0
checking target system type... i386-apple-darwin10.2.0
checking for a BSD-compatible install... /usr/bin/install -c
...
configure: error: GNU MP not found, see http://gmplib.org/."For OSX, install GNU MP with "CFLAGS+=-m32 ./configure ABI=32 && make"

これは見たことありますね。GNU MPが入ってない旨のメッセージ。

続きを読む

(15:09) Φ

2009年03月21日

「なあ、moshでもMeCabを使ってみようか (第1話) (第2話) (第3話)」の続き。

既にCの構造体サポートがあるYpsilonのFFIでもやってみた。→

svn co http://lambdarepos.svnrepository.com/svn/share/lang/scheme/r6rs/ypsilon/ffi/mecab-ffi/trunk ypsilon-mecab-ffi

参考:

メモ:

  • floatなメンバがあるとinternal inconsistencyが出る。→とりあえず使わないことにして、intで回避
  • char*なメンバから文字列を得る簡単な方法があるか(moshのpointer->string的な)
続きを読む

(16:59) Φ

2009年03月20日

(第1話) (第2話)


とりあえずλreposに放り込んだ。→
svn co http://lambdarepos.svnrepository.com/svn/share/lang/scheme/r6rs/mosh/ffi/mecab-ffi/trunk mecab-ffi

ディレクトリの規則とかまだ分かっていないけれど、暫定的に
(binding mecab-ffi)
に入れてみる。mosh側で公式置き場とか公式ルールとかあればそれに従う。

(17:50) Φ

2009年03月17日

(第1話はこちら)


moshのFFIで(無理矢理)構造体 mecab_node_t の中身を覗くの巻。

(import (mosh ffi))すると、pointer-ref とか pointer->string という関数が使えるようになる。

(1) (pointer-ref pointer [index])

・indexは省略可(デフォルトは 0)。

((unsigned long *)pointer)[index]相当のことをやってくれる。

(2) (pointer->string pointer)

・pointerから始まる文字列(NULL終端?)を読み、文字列を返す。

mecab_node_t を読む場合の注意事項

(1) shortとかcharなメンバがある

・現状ではアラインメントを手計算

(2) surface は最初のlengthバイトだけ欲しい

・便利関数 pointer->string が使えないケース。

続きを読む

(01:12) Φ

2009年03月14日

moshのFFIを使ってlibmecabにアクセスしてみるの巻。

FFIの使い方

(mosh ffi)をimportして、あとはこういうのとか見ながら、簡単なMeCabのバージョン表示プログラムを書いてみた:

(import (rnrs)
        (mosh)
        (mosh ffi))

(define libmecab (open-shared-library "/usr/local/lib/libmecab.1.dylib"))
(define mecab-version
  (c-function libmecab char* mecab_version))

(format #t "mecab version: ~a\n" (mecab-version))

mecab version: 0.98pre1

Good.

形態素解析してみよう

moshを開発中の22世紀の科学者に敬意を表し、「ぼく、ひげぽん。」という文を解析してみることにする。

mecab_t* は(今のところ)ポインタさえ渡せればよいので void* で代用。

(import (rnrs)
        (mosh ffi))

(define libmecab (open-shared-library "/usr/local/lib/libmecab.1.dylib"))

(define mecab-new2
  (c-function libmecab void* mecab_new2 char*))
(define mecab-sparse-tostr
  (c-function libmecab char* mecab_sparse_tostr void* char*))
(define mecab-destroy
  (c-function libmecab void mecab_destroy void*))

(define m (mecab-new2 ""))
(display (mecab-sparse-tostr m "ぼく、ひげぽん。"))
(mecab-destroy m)
続きを読む

(20:16) Φ

2009年03月07日

[2日目に戻る]


moshでコードの実行時間を計測したい。

moshでベンチマークをどうやって取ってるかと思い script/bench2?.scm を見るとシェルから実行してる・・・

ypsilonでは (time-usage) を実行前と実行後に呼び、real,user,sys 各成分の差分を表示している。

※ypsilonのtime-usageとかformatの仕様がupdate3とtrunkで違うww

これをmoshに移植して実験。

シェルを使わずに時間を測れるようになった。めでたしめでたし。

続きを読む

(23:30) Φ

2009年03月06日

[1日目に戻る]


Project Eulerで沢山書いた地球温暖化コードをポータブルな形に書き直し、ypsilonについてるgambit-benchmarkをベースにしたオレオレbenchmarkを書こうとしている。(※これはLTで発表しようとして没になったテーマ)

ypsilon用の実行スクリプトを参考にmosh用のを書こうとしていたが、string-appendで動的に合成した名前のファイルをincludeできないっぽい。ファイル名が文字列リテラルなら行けるのだけれど。

逆引きschemeに載ってるincludeを書いても動かない。syntax-caseとかdatum->syntaxとか訳がわかっていない。藤田さんのTTのビデオ(YouTube,ニコ動)見たけどやはり分かっていない。ブロック崩しはちょっとかっこいい。

GaucheからR6RS環境への移行のハードルが思いのほか高いことを思い知った2日目。Reading Moshなう。


続きを読む

(23:27) Φ

2009年03月05日

(某SNSより転載)


R6RSへの移行(あるいは併用)を考えつつ、とりあえず処理系を幾つかインストール

mosh

ypsilon

petite chez scheme

moshのtrunkを入れる際にGNU MPも入れた。

Project Eulerの時に書いたコードを動かしてみようと思ってlibraryとかimportとかでハマる。処理系ごとに怒られポイントが微妙に違う。

ypsilonで「error in library: duplicate import identifiers」をよく食らう。ypsilonの--disable-acc というオプションを覚えるなどした。


[2日目へ続く]

通信欄:yhara先生のScheme処理系食べある記がひじょうに参考になる。(もっとやれ)

続きを読む

(23:42) Φ