From: MAEDA Shugo Date: 1997-05-20T21:09:08+09:00 Subject: [ruby-list:2978] Re: [s-lang:00052] Re: Python/Ruby Jed 前田です。 # ruby-listをCCに入れてます。 # リプライする方はもCCにruby-listを入れていただけるとありがたいです。 On Tue, 20 May 97 11:05:11 +0900, toyofuku@juice.or.jp wrote: | 取りあえず動くものが早く欲しい(クラスとかちゃんと |やってると時間かかりそうな)ので、mainのメソッドという |のは一時的にと考えています。 それでしたら、たぶんモジュールにしても手間はそんなに変らないと思います。 Cで書くと VALUE mFoo; VALUE foo_test_method(VALUE obj) { .... } void init_jedlib() { mFoo = rb_define_module("Foo"); rb_define_module_function(mFoo, "test_method", foo_test_method, 0); } みたいな感じで、rubyにmoduleとそのmodule functionを登録できますから。 基本的にrubyのクラス、モジュールをCで書くこと自体は簡単です。 |> たとえば、 |> 1. Buffer classを実装して、バッファに対する操作を行なう |> メソッドを用意する。 |> 2. カレントバッファに対しての操作はmodule functionにして、 |> トップレベルでincludeする。 |> なんてのはどうでしょう? |> こうすればあるバッファに対する操作を行ないたい場合に |> カレントバッファを切りかえる必要がなくなりますし、 | | こんな感じでしょうか。 |(レシーバとかいい加減かもしれませんが、雰囲気だけくんで |下さい) | | yomi = "かんじ" | # "skk.jisyo"バッファからサーチ | jisyo = jed.getbuffer("skk.jisyo") | jisyo.bol_fsearch(yomi + " ") | jisyo.go_right(yomi.length + 1) | jisyo.push_mark(); jisyo.eol() | s = jisyo.bufsubstr() | kouho = s.split("/") # 変換候補リスト | insert(kouho[0]) # カレントバッファに第一候補を挿入 そういう感じです。 $current_buffer.insert "test.\n" と insert "test.\n" が同じ動作になるような感じをイメージしてます。 |> test_proc = Proc.new { |> print "This is a proc object.\n" |> } |> みたいにnewメソッドのイテレータブロックをオブジェクト化する |> わけです。 | | クロージャは名前しか知らないのですが、ラムダ式みたいなもん |ですか? たぶん同じようなものだと思います。 |> それで、Procオブジェクトを |> regist_key_event("^Xt", test_proc) |> のようにキーに登録して、キーが押された時にはJed側でテーブル |> を参照して対応するProcオブジェクトをcallしてやればいいのでは |> ないかと。 |> でも、やっぱりトップレベルのメソッドをメソッド名で登録した方が |> 普通っぽくて使いやすいのかなあ。 |> あ、文字列(Stringオブジェクト)の時はメソッド名で解釈して、Proc |> オブジェクトの時はそのように扱う、なんてこともできそうですね。 |> 変数には型がありませんから、受けとってから解釈すればいい、と。 | | メソッド名(Lisp ではシンボル?)の方が再定義しやすいとか |ありませんか。Emacs Lisp の define-key ではシンボルもラムダ式も |書けるんじゃなかったでしたっけ。 いっそのことinteractiveなメソッドは全部JedCommandというモジュール のメソッドにするというのはどうでしょう? def JedCommand.foo ... end と定義しといて、 JedCommand.dispatch_key :foo, "^Xt" でキーを割り当てるわけです。 # もちろんdispatch_keyはあらかじめ定義しておきます。 # ":key"はkeyメソッドのIDです。 でdispatch_keyされた時にJed側でテーブルに登録しといて、 キーが押された時には rb_funcall(mJedCommand, id); すれば良いのではないかと。 M-xとかの時の補完リストを作るのにJedCommandのメソッドを 列挙できたら便利ですね。 # そういうことできるのでしょうか>まつもとさん -- 前田 修吾