[ruby-list:2978] Re: [s-lang:00052] Re: Python/Ruby Jed

From: MAEDA Shugo <shugo@...>
Date: 1997-05-20 12:09:08 UTC
List: ruby-list #2978
前田です。
# ruby-listをCCに入れてます。
# リプライする方はもCCにruby-listを入れていただけるとありがたいです。

On Tue, 20 May 97 11:05:11 +0900,
toyofuku@juice.or.jp <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のメソッドを
列挙できたら便利ですね。
# そういうことできるのでしょうか>まつもとさん

-- 
前田 修吾 <shugo@po.aianet.ne.jp>

In This Thread

Prev Next