!kiyoka.blog.2010_08 RSSPLAIN

Related pages: !kiyoka.blog.list
35535554424444444444444444444404445555555555555555055555555555555555555555555555555555555555550555555555555555555555505555555555555555505555555555551555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555055555551555555555555505555555555555555555555555555555555555555555555555555555555555555555505
3

kiyoka日記。NendoSekkaの開発や、最近思うことなど

5

最新10件!kiyoka.blog   過去記事一覧!kiyoka.blog.list

5

kiyoka.blog_header 

3

このブログを書いている人: 西山 清香(kiyoka) - twitter: @kiyokaEXT

5

5

 

5

 

4

kiyoka.2010_08_30[Sekka] Sticky-shiftを試してみたら、小指が痛くなくなった。

4

L0aVzy

2

Sekka(石火)はSKKと同じように、大文字で送り仮名の位置を指定するので、SKKと同じで Shiftキーを使いすぎて小指が痛くなるという問題がある。

4

例えば、"行う" を入力したい場合はローマ字で、 "OknaU" と入力しないといけない。

4

 

4
OkonaU[Ctrl-J]
4

と入力すると

4
行う
4

という文字列に変換される。([Ctrl-J]キーはカーソル位置の直前のローマ字を日本語に変換するキー)

4

 

4

この小指酷使問題に決着を付けるべく、SekkaでSticky-shiftを使えるようにしてみた。

4

";" というキーがShiftの代わりの役割をするのだが、本物のShiftキーとの違いは、Shiftを押しっぱなしにしなくても良いところだ。

4

例えば、 "A" を入力したい場合、 ";" と "a" を順番に入力すれば "A" になる。

4

上記の例の、"行う"を入力する場合は、

4
;okona;u[Ctrl-J]
4

と入力すればよい。

4

 

4

結論としては、小指を酷使することがなくなって小指が痛くなる問題がなくなった。

4

これでSekkaによる快適な日本語入力ライフが送れそうだ。

4

Sekkaはあくまで実験的な日本語入力メソッドなので、まだリリースの形がイメージできていないが、多分始めのうちは、gem installして動かすというものになりそう。

4

まだまだ先になりそうだけど。

4

使ってみたい人はどれくらいいるのかなぁ。かなりニッチな入力方法だと思うのだけど…

4

 

0

comment (disabled)

4

4

 

4

 

5

kiyoka.2010_08_27[Nendo][Sekka] SekkaをRackEXTに載せて、試験運用中

5

現在、新しい日本語入力メソッド(Sekka)を開発中だ。

5

とりあえずRackEXTに載せることができた。(結局先日書いた方法でNendoの定義関数をRackからうまく呼びだすことができたのである)

5
 rack-logo
5

sekka.elを1日程度ででっちあげて、このブログはEmacs+Sekkaで書いている。(勝手知ったるsumibi.elを改造したのでそんな期間でできたのだが…)

5

まだまだ使いにくい所がたくさんあるので、結論は出しにくいけれど、まあまあ希望が持てそうな使い心地だ。

5

SKKを使ってきた人なら数分もあれば、慣れるんじゃないかと思う。

5

 

5

Sekkaはこの2010年という統計的自然言語処理全盛の時代にあって、統計的処理をほとんど使わない。(ローマ字キーワードの曖昧検索を使っているが、それは統計処理ではない)

5

要するに時代を逆行する日本語入力メソッドなので、今開発すること自体どうなのかと思うところはあるけれど、Google日本語入力のような凄いものが出てきた今だからこそ、逆を狙うのも面白いのではないかと思う。

5

私は立場的に自然言語処理の研究者でもないし、特に咎められることは無い。

5

 

5

それにしても、はやくも小指が痛くなってきたぞ。これがSKKライクな入力方式の最大の欠点だ。

5

これを解決する手段を早く考えないといけない…(笑)

5

Sticky-Shiftという手段があるそうで、それで緩和するのかどうかも試してみる予定だけど、もっといいアイデアは無いかなぁ。

5

 

0

comment (disabled)

5

5

 

5

 

5

kiyoka.2010_08_25[Nendo] Nendoで定義した関数をRubyから呼べるようになった

5

私がRubyで書いているLisp方言、 Nendoについて。

5

 

5

タイトルの通り、Nendoで定義した関数をRubyから呼べるようになった。

5

これで、Nendoで書いたコードをRubyのライブラリとして呼べるようになる。

5

 

5

以下はサンプルプログラム [ export-lisp-functions.rb ]

5
#!/usr/local/bin/ruby
5
5
require 'nendo'
5
5
def main
5
  core = Nendo::Core.new()
5
  core.loadInitFile
5
  lst = [ "a", "b", "c",
5
          [ "d", "e" ].to_list
5
        ].to_list
5
  core.evalStr( '(define (sexpToString sexp) (write-to-string sexp))' )
5
  core.evalStr( '(export-to-ruby sexpToString)' )
5
  core.evalStr( '(use text.tree)' )
5
  core.evalStr( '(define (treeToString sexp) (tree->string sexp))' )
5
  core.evalStr( '(export-to-ruby treeToString)' )
5
  puts core.sexpToString( lst )
5
  puts core.treeToString( lst )
5
end
5
5
main
5

 

5

Nendoの世界で (export-to-ruby シンボル) と宣言すると、Nendo::Coreクラスのインスタンス(サンプルでは core) に同名のメソッドが動的に増えるのだ。

5

動的にメソッドが生えるというのはなんか気持ち悪いけれど、Rubyの世界では普通なのです。ほんとほんと。

5

※ 現状は、引数の数が固定の関数しか export できないルールにしている。まあ困らんだろう。

5

 

5
 [実行結果]
5
$ ./export-lisp-functions.rb 
5
("a" "b" "c" ("d" "e"))
5
abcde
5

 

5

これで、Nendoで書いたアプリを、RackやSinatra(Webアプリケーションフレームワーク)に乗せることができるようになったはず。

5

早速、Sekkaという新しい日本語変換エンジンをのせていくところから始める予定。

5

 

0

comment (disabled)

5

5

 

5

 

5

kiyoka.2010_08_24[Ruby][Sekka] Rackについて学ぶ

5

現在、新しい日本語入力メソッド(Sekka)を試作中なのだが、サーバとクライアントの通信はHTTPにしようと考えている。(Sumibi.orgもHTTPであったが)

5
 日本語入力メソッドはNendoで書いているので、WebサーバはRubyで書かれたものが使える。というか使えるようにする。
5

その中でも、Ruby界ではRackというフレームワークが標準になっているようなので、それを試しに使ってみることにした。

5
 rack-logo
5

Rackって何? という方はこのyharaさんの良記事を読んで頂ければ即理解できるだろう。

5
 Route 477 - 5分でわかるRack , シュレーディンガーの猫たちEXT
5

 

5

今は、それに合わせて、Nendoの世界で定義したLisp関数をRubyから呼び出す手段を準備中。

5

こんな感じで、Nendoにちょこちょこ手を入れつつ、日本語入力メソッドを作りつつ、Rubyのライブラリについて学ぶという有意義なループを回している。

5

 

5

それにしてもRubyのコミュニティーはRailsからハジケて金回りが良くなっているからか、どんどんライブラリが整備されてきているのでいろいろ便利になっているなぁーと実感する。

5

これは学習して利用しない手は無いぞぅ。

5

 

5

その他参考記事:

5
 Ruby Freaks Lounge:第23回 Rackとは何か(1)Rackの生まれた背景|gihyo.jp … 技術評論社EXT
5
 Ruby Freaks Lounge:第24回 Rackとは何か(2)Rackの使い方|gihyo.jp … 技術評論社EXT
5
 Ruby Freaks Lounge:第25回 Rackとは何か(3)ミドルウェアのすすめ|gihyo.jp … 技術評論社EXT 
5

 

0

comment (disabled)

5

5

 

5

 

5

kiyoka.2010_08_12[Nendo][Sekka] TDD(テスト駆動開発)の重要性

5

 

5

実験中の新しい日本語入力メソッド Sekka(仮名)をNendoで作ろうとしているが、そのためにNendoに足りない機能を足している。

5

SekkaはちゃんとTDD(テスト駆動開発)で開発していく予定なので、unit testフレームワークが必要になった。

5

そこで、gauche.testの基本機能をポーティングしたところ。

5
 リンク: Gauche ユーザリファレンス: 9.22 gauche.test - 単体テストEXT
5

 

5

実は、恥ずかしながらSumibi.orgはunit testの様に再現可能なテストスイートは持っていないので、ソースコード規模が大きくなるほどメンテナンスに対する心理的負担が大きくなっていった。リファクタリングもなかなか困難になっていた。

5

Nendoで完全にTDDを実践し、いまではTDD以外の開発は考えられなくなった。プログラミング言語処理系の開発にはテストスイートが必須だと思う。おそらく複雑なアルゴリズムを使ったソフトウェアには同様にそれなりの量のテストスイートが無いとどこかで必ず開発が破綻するだろう。

5

SekkaもTDDで開発していつでもリファクタリングできる状態を維持しよう。

5

 

5
 参考: テスト駆動開発 - WikipediaEXT
5
 0321146530  Test Driven Development: Kent Beck
5

 

0

comment (disabled)

5

5

 

5

 

5

kiyoka.2010_08_10[創作心理][SKK] modeless SKK

5

modeless SKKのプロトタイプの作成中。Sekka:石火(仮名)

5

L0aVzy

5

 

5

曖昧検索の評価

5

プロトタイプといっても、曖昧検索がどれくらい効果的かという実験をしようとしているところ。

5

曖昧検索というのはGoogle検索の『もしかして』機能をイメージしてもらえれば良いかと思う。それをローマ字の綴りに限定したもの。

5

昔からある yc.el や ゆでたまご等の modeless 入力メソッドの弱点は、目視では変換前のローマ字綴り間違いに気づきにくいというところ。

5

例えば、『しぜんげごしょり』なら間違いにきがつきやすいが、『shizengegosyori』では全くどこが抜けたのかわからないだろう。

1

今回の曖昧検索を modeless SKK に適用すれば、上のキーワードでも『自然言語処理』を変換候補にすることが可能だ。

5

 

5

さて、実装だが、SKKのラージ辞書 (SKK-JISYO.L) をローマ字をキーに検索できるようにし、辞書に入っているローマ字と、ユーザー入力のローマ字のJaro-Winkler距離が近い方から列べるとどんな具合いかを見た。

5

結果はなかなか脈ありな感じ。

5

以下に実行結果を載せているけれども、

5

『雰囲気』に対するローマ字クエリとしてfunnikiでもfunikiでも、さらに間違ったfuinkiでも救えていたり、『漢字変換』に対しては kajinhenkan や kanjihekan を救えているのはいいかも。

5

 

5

実験の様子

5

 

5
JaroW()がJaro-Winklerの距離(値域 0.0 ≦ 1.0)
5
閾値 = 0.940000 は JaroWの値での足切り値
5

 

5
$ ./aimai
5
> henkan
5
閾値 = 0.940000  探索件数(1176)
5
----------
5
 JaroW(1.00000) Jaro(1.00000) PairD(1.00000) [henkan]:[変換/返還]
5
 JaroW(0.96667) Jaro(0.94444) PairD(0.88889) [henka]:[変化/返歌]
5
 JaroW(0.95000) Jaro(0.91667) PairD(0.83333) [henkango]:[変換後/返還後]
5
 JaroW(0.95000) Jaro(0.91667) PairD(0.83333) [henkanbu]:[変換部]
5
 JaroW(0.95000) Jaro(0.91667) PairD(0.66667) [henkabun]:[変化分]
5
 JaroW(0.95000) Jaro(0.91667) PairD(0.83333) [henkanji]:[変換時]
5
 JaroW(0.95000) Jaro(0.91667) PairD(0.83333) [henkanki]:[変換器/変換機]
5
 JaroW(0.95000) Jaro(0.91667) PairD(0.66667) [henkaten]:[変化点]
5
 JaroW(0.95000) Jaro(0.91667) PairD(0.66667) [henkouan]:[変更案]
5
> henkann
5
閾値 = 0.940000  探索件数(1176)
5
----------
5
 JaroW(0.97143) Jaro(0.95238) PairD(0.90909) [henkan]:[変換/返還]
5
 JaroW(0.95556) Jaro(0.92593) PairD(0.71429) [henkanten]:[変換点]
5
 JaroW(0.94286) Jaro(0.90476) PairD(0.80000) [henka]:[変化/返歌]
5
 JaroW(0.94000) Jaro(0.90000) PairD(0.66667) [henkantani]:[変換単位]
5
> funiki
5
閾値 = 0.940000  探索件数(2851)
5
----------
5
 JaroW(1.00000) Jaro(1.00000) PairD(1.00000) [funiki]:[雰囲気/氛圍氣;「雰」別字、「囲」「気」旧字]
5
 JaroW(0.97143) Jaro(0.95238) PairD(0.72727) [funinki]:[不人気]
5
 JaroW(0.94167) Jaro(0.91667) PairD(0.66667) [funehiki]:[船引]
5
 JaroW(0.94167) Jaro(0.91667) PairD(0.66667) [funabiki]:[船曳]
5
> funniki
5
閾値 = 0.940000  探索件数(2851)
5
----------
5
 JaroW(0.96667) Jaro(0.95238) PairD(0.90909) [funiki]:[雰囲気/氛圍氣;「雰」別字、「囲」「気」旧字]
5
 JaroW(0.96667) Jaro(0.95238) PairD(0.66667) [funinki]:[不人気]
5
> fuinki
5
閾値 = 0.940000  探索件数(2851)
5
----------
5
 JaroW(0.95556) Jaro(0.94444) PairD(0.40000) [funiki]:[雰囲気/氛圍氣;「雰」別字、「囲」「気」旧字]
5
> tokyo
5
閾値 = 0.940000  探索件数(3795)
5
----------
5
 JaroW(1.00000) Jaro(1.00000) PairD(1.00000) [tokyo]:[トーキョー/東京]
5
 JaroW(0.96667) Jaro(0.94444) PairD(0.88889) [tokyou]:[都響;[略語]東京都交響楽団]
5
 JaroW(0.96111) Jaro(0.94444) PairD(0.66667) [tokiyo]:[時世]
5
 JaroW(0.96111) Jaro(0.94444) PairD(0.88889) [tokkyo]:[特許]
5
 JaroW(0.95333) Jaro(0.93333) PairD(0.57143) [toko]:[床/常]
5
 JaroW(0.94667) Jaro(0.93333) PairD(0.57143) [toyo]:[豊/樋/豐;「豊」の旧字]
5
> toukyouto
5
閾値 = 0.940000  探索件数(3795)
5
----------
5
 JaroW(1.00000) Jaro(1.00000) PairD(1.00000) [toukyouto]:[東京都]
5
 JaroW(0.95556) Jaro(0.92593) PairD(0.75000) [toukyougo]:[東京語]
5
 JaroW(0.95556) Jaro(0.92593) PairD(0.85714) [toukyou]:[東京/東教]
5
 JaroW(0.95000) Jaro(0.91667) PairD(0.84211) [toukyoutomin]:[東京都民]
5
 JaroW(0.95000) Jaro(0.91667) PairD(0.84211) [toukyoutonai]:[東京都内]
5
 JaroW(0.95000) Jaro(0.91667) PairD(0.84211) [toukyoutosyo]:[東京図書]
5
> tokyoto
5
閾値 = 0.940000  探索件数(3795)
5
----------
5
 JaroW(0.94286) Jaro(0.90476) PairD(0.80000) [tokyo]:[トーキョー/東京]
5
 JaroW(0.94074) Jaro(0.92593) PairD(0.57143) [toukyouto]:[東京都]
5
> change
5
閾値 = 0.940000  探索件数(4109)
5
----------
5
 JaroW(1.00000) Jaro(1.00000) PairD(1.00000) [change]:[チェンジ]
5
 JaroW(0.97143) Jaro(0.95238) PairD(0.90909) [changer]:[チェンジャー]
5
 JaroW(0.96667) Jaro(0.94444) PairD(0.88889) [chang]:[チャン/チャング]
5
 JaroW(0.95000) Jaro(0.91667) PairD(0.83333) [changeup]:[チェンジアップ]
5
> chance
5
閾値 = 0.940000  探索件数(4109)
5
----------
5
 JaroW(1.00000) Jaro(1.00000) PairD(1.00000) [chance]:[チャンス]
5
> tokugawaie
5
閾値 = 0.940000  探索件数(3795)
5
----------
5
 JaroW(0.96000) Jaro(0.93333) PairD(0.87500) [tokugawa]:[徳川]
5
 JaroW(0.96000) Jaro(0.93333) PairD(0.77778) [tokugawake]:[徳川家]
5
 JaroW(0.96000) Jaro(0.93333) PairD(0.77778) [tokugawaki]:[徳川期]
5
 JaroW(0.94286) Jaro(0.90476) PairD(0.81818) [tokugawaienari]:[徳川家斉;11th(1787-1837)]
5
 JaroW(0.94286) Jaro(0.90476) PairD(0.81818) [tokugawaienobu]:[徳川家宣;6th(1709-12)]
5
 JaroW(0.94286) Jaro(0.90476) PairD(0.81818) [tokugawaiemitu]:[徳川家光;3rd(1623-51)]
5
 JaroW(0.94286) Jaro(0.90476) PairD(0.81818) [tokugawaietugu]:[徳川家継;7th(1713-16)]
5
 JaroW(0.94286) Jaro(0.90476) PairD(0.81818) [tokugawaietuna]:[徳川家綱;4th(1651-80)]
5
 JaroW(0.94286) Jaro(0.90476) PairD(0.81818) [tokugawaieyasu]:[徳川家康;1st(1603-05)]
5
 JaroW(0.94286) Jaro(0.90476) PairD(0.81818) [tokugawaieharu]:[徳川家治;10th(1760-86)]
5
 JaroW(0.94286) Jaro(0.90476) PairD(0.81818) [tokugawaiesada]:[徳川家定;13th(1853-58)]
5
> gengosyori
5
閾値 = 0.940000  探索件数(1487)
5
----------
5
 JaroW(1.00000) Jaro(1.00000) PairD(1.00000) [gengosyori]:[言語処理]
5
 JaroW(0.95385) Jaro(0.92308) PairD(0.85714) [gengosyorikei]:[言語処理系]
5
> nihongo
5
閾値 = 0.940000  探索件数(2278)
5
----------
5
 JaroW(1.00000) Jaro(1.00000) PairD(1.00000) [nihongo]:[日本語]
5
 JaroW(0.95556) Jaro(0.92593) PairD(0.85714) [nihongoon]:[日本語音]
5
 JaroW(0.95556) Jaro(0.92593) PairD(0.85714) [nihongoka]:[日本語化/日本語可]
5
 JaroW(0.94286) Jaro(0.90476) PairD(0.80000) [nihon]:[日本/二本]
5
 JaroW(0.94286) Jaro(0.90476) PairD(0.83333) [nihonga]:[日本画]
5
 JaroW(0.94286) Jaro(0.90476) PairD(0.83333) [nihongi]:[日本紀;六国史、または日本書紀のこと]
5
 JaroW(0.94000) Jaro(0.90000) PairD(0.80000) [nihongoban]:[日本語版]
5
 JaroW(0.94000) Jaro(0.90000) PairD(0.80000) [nihongobun]:[日本語文]
5
 JaroW(0.94000) Jaro(0.90000) PairD(0.80000) [nihongomei]:[日本語名]
5
 JaroW(0.94000) Jaro(0.90000) PairD(0.80000) [nihongofuu]:[日本語風]
5
 JaroW(0.94000) Jaro(0.90000) PairD(0.80000) [nihongoron]:[日本語論]
5
 JaroW(0.94000) Jaro(0.90000) PairD(0.80000) [nihongotuu]:[日本語通]
5
 JaroW(0.94000) Jaro(0.90000) PairD(0.80000) [nihongoyou]:[日本語用]
5
 JaroW(0.94000) Jaro(0.90000) PairD(0.66667) [nihonsaigo]:[日本最後]
5
> kanakanji
5
閾値 = 0.940000  探索件数(7813)
5
----------
5
 JaroW(1.00000) Jaro(1.00000) PairD(1.00000) [kanakanji]:[かな漢字/仮名漢字]
5
 JaroW(0.95556) Jaro(0.92593) PairD(0.85714) [kanakan]:[かな漢/仮名漢]
5
> kanakannji
5
閾値 = 0.940000  探索件数(7813)
5
----------
5
 JaroW(0.98000) Jaro(0.96667) PairD(0.94118) [kanakanji]:[かな漢字/仮名漢字]
5
 JaroW(0.94000) Jaro(0.90000) PairD(0.80000) [kanakan]:[かな漢/仮名漢]
5
> kanakenji
5
閾値 = 0.940000  探索件数(7813)
5
----------
5
 JaroW(0.95556) Jaro(0.92593) PairD(0.75000) [kanakanji]:[かな漢字/仮名漢字]
5
> kajinhenkan
5
閾値 = 0.940000  探索件数(7813)
5
----------
5
 JaroW(0.97576) Jaro(0.96970) PairD(0.70000) [kanjihenkan]:[漢字変換]
5
> kanjihekan
5
閾値 = 0.940000  探索件数(7813)
5
----------
5
 JaroW(0.96182) Jaro(0.93636) PairD(0.84211) [kanjihenkan]:[漢字変換]
5
 JaroW(0.94000) Jaro(0.90000) PairD(0.66667) [kanjika]:[漢字化]
5
> q
5
quit.
5
5

 

5

参考資料

5
 Jaro–Winkler distance - Wikipedia, the free encyclopediaEXT (英語)
5
 AWK Users JP :: Jaro-Winkler 距離の計算EXT
5
 スペルミス修正プログラムを作ろうEXT
5

 

5

ソースコード

5

Nendoで書いている。ライブラリはKyoto CabinetEXTamatchEXTを使っている。

5
 src/aimai at d537aa2d48789eaca6aa8de7301b84a0ae2819b4 from kiyoka's sekka - GitHubEXT
5

 

5

課題

5

送り仮名の綴り間違いをどうするかが課題だなあ。

5

 

0

comment (disabled)

5

5

 

5

 

5

kiyoka.2010_08_08[創作心理] 今創りたいもの(2) 『modeless SKK』

5

以前に同様のタイトルで作りたいものをリストアップした。 (kiyoka.2010_05_08[創作心理] 今作りたいもの)

5

Nendoの開発を進めながら、ここらで一旦アプリケーションを書いてみるというステージに戻るのも悪くないかなと思ってどんなものがいいか考えてみた。

5

 

1

前にも書いたがSKKライクな日本語入力メソッドを試しに作ってみたいと思っている。

5

私は普段、Sumibi.orgという自作の日本語入力メソッドをEmacsから使っているが、少し不満が出てきた。

5

やはり、自分の期待した使い勝手に到達していない。(いつも使っている上での感覚的な話)

5

 

5

そこで一旦寄り道して、modelessなSKKを作ったらどんな使い心地なのかを試してみることにした。(曖昧検索機能もアリ)

5

ただし、試してみてSumibiを超えられそうにないようだったら、すぐにプロジェクト中止となるので、完成することを期待しないで頂きたい。

5

個人的にNendoのドッグフーディングの観点からすると、このお題はなかなか良いと自負している。

5

KyotoCabinetというDBを使ったり、それなりに大量の件数のデータ(SKKのラージ辞書)を正規表現などを駆使して意味のあるデータに変換しないといけないので、処理系にとっては実用性が試される。

5

 

5

現在KyotoCabinetとAmatchというgemライブラリを使ってローマ字綴りでの曖昧検索が使いものになるか試してみているところだが、1日程度で実験の土台ができたのは思っていたよりも早かった。

5

(Nendoの功績というよりも、使えるgemが豊富にあるというのが大きい)

5

 

5

今後、曖昧検索の実験が進んだらブログ記事で紹介しよう。

5

 

0

comment (disabled)

5

5

 

5

 

5

kiyoka.2010_08_02[Nendo] Gaucheのobject-applyのようなことをしたい

5

私がRubyで書いているLisp方言、 Nendoについて。

5

 

5

Gaucheでは次のようなことができる。Rubyでいうところの

5
/abc/ =~ "abc"
5

と同じ処理が

5
(#/abc/ "abc")
5

のように書ける。

5

 

5

これは、Gaucheのリファレンスマニュアルをちゃんと読む前は、きっと内部(reader)で #/abc/ のリテラル部分がこんな感じのコードに変換されているのだろうと思っていた。

5
(lambda (str)
5
  (rxmatch #/abc/ str))
5

でも、以下の例ように引数に正規表現リテラルが来る場合はまずい。

5

#/abc/ 部分が (lambda ...) にされてしまったら、rxmatchはどう定義すればいいのか... いったい引数の型チェックはどうすればいいの?

5
(rxmatch #/abc/ "abc")
5

 

5

で、Gaucheのリファレンスマニュアルを見ると、『適用可能なオブジェクト』という仕組みで実現されている。これは面白い。

5
 Gauche ユーザリファレンス: 6.16 制御EXT
5
 
5
 6.16.2 適用可能なオブジェクト
5
 
5
 Gaucheでは、特別な組み込みの機構によって任意のオブジェクトを「適用可能」
5
 にすることができます。
5
 
5
 Generic Function: object-apply object arg …
5
    
5
     手続きでもジェネリックファンクションでもないオブジェクトが何らかの
5
     引数に適用されたとき、そのオブジェクトと引数がジェネリックファンク
5
     ションobject-apply に渡されます。
5
    
5
     この機能は、具体的な例を挙げた方が説明し易いでしょう。
5
    
5
 例えば、次のような式を評価しようとしたとします。
5
 
5
  ("abcde" 2) 
5
 
5
 オペレータは文字列に評価されますから、手続きでもジェネリックファンクショ
5
 ンでもありません。そこで、Gaucheはこの式を、あたかも次のような式が与え
5
 られたかのように解釈します。
5
 
5
  (object-apply "abcde" 2) 
5
 
5
 デフォルトでは、<string>と<integer>を引数とする object-applyのメソッド
5
 は定義されていないので、この式はエラーになります。しかし、次のようなメ
5
 ソッドを定義すると:
5
 
5
  (define-method object-apply ((s <string>) (i <integer>))
5
     (string-ref s i))                                     
5
 
5
 最初の式はまるで文字列が整数に適用されたかのように動作します。
5
 
5
   ("abcde" 2) → #\c 
5
 
5

 

5

NendoでGaucheのモノマネをしようとすると、マルチメソッドディスパッチャを実装しないといけないのかー。

5

しかし、この仕組みは凄く柔軟性があって上述の (#/abc/ "abc") のような記述を拡張していけるので魅力的だ。

5

ただ、うまくマルチメソッドディスパッチを実装しないと非常に実行効率の悪いものが出来上がりそう....

5

(Rubyでいうところの method_missing と同じように便利で強力だけど反面重いので気をつけて使えというものになりそう)

5

 

5

Nendoでもマルチメソッドディスパッチとobject-applyを実装して実現するのは楽しそうだけど、いいのかな。

5

もうちょっと考えてみよう。

5

Nendoでは、将来Rubyのクラスを定義できるようにするのか等、まだ考えきれていないところがたくさんあるので、それと合わせて考える必要があるなぁ。

5

 

5

COMMENTshiro

マニュアルへのパーマリンクはこんな感じで貼れますよ。p=の後の単語をindexから探してそこにジャンプするcgiになってます。

http://practical-scheme.net/gauche/man/?l=jp&p=object-apply

5

COMMENTkiyoka

shiroさん、ありがとうございます。

ブログ記事中のリンクをパーマリンクに直しておきました。

0

comment (disabled)

5