トップ «前の日記(2005-08-22 (Mon)) 最新 次の日記(2005-08-24 (Wed))» 編集   RSS 1.0 FEED  

Journal InTime


2005-08-23 (Tue) [長年日記]

_ Coroutines in C

anthy-devより。

Cで、

switch (count % 8) {
    case 0:        do {  *to = *from++;
    case 7:              *to = *from++;
    case 6:              *to = *from++;
    case 5:              *to = *from++;
    case 4:              *to = *from++;
    case 3:              *to = *from++;
    case 2:              *to = *from++;
    case 1:              *to = *from++;
                   } while ((count -= 8) > 0);
}

のように書けることを利用してコルーチンを実現するという話。 Cは奥が深いな。*1

そういえば、と思って、前にScrapBookで取りこんでおいた 以下の記事を見に行ったら、すでにページがなくなっていた。

C言語でコルーチン

どこかに移動したんだろうか。

Tags: C

*1  褒め言葉ですよ。

_ Method Finder

Method Finder というのは、振る舞いからメソッドを探す(!)ためのある種“逆引き”ユーティリティ。「3. 4. 7」とかいうふうに、レシーバ、引数、(期待される)返値の順にリテラル(あるいは値を生成する式)をピリオドで区切って入力すると、該当するメソッドを列挙してくれます。

[sumim’s smalltalking-tos - Ruby の <=>より引用]

へえ。Rubyだとこんな感じかなあ。

def find_method(recv, args, ret)
  return Thread.start {
    $SAFE = 4
    recv.methods.select { |method|
      begin
        recv.send(method, *args) == ret
      rescue Exception
        false
      end
    }
  }.value
end

p find_method(3, [4], 7)
p find_method("foo", ["f", "F"], "Foo")
p find_method("foo", [], "Foo")

実行結果:

$ ruby findmethod.rb
["+", "|", "^"]
["sub", "tr", "gsub", "tr_s"]
["capitalize"]

すごくいやな予感がしたので、一応$SAFE = 4にしてみたけど、 Squeakではどうやって実現してるんだろうか。

Tags: Ruby

_ Re: Method Finder for ruby

すでにあったらしいorz....

id:shinichiro_h さんが、Squeak の Method Finder にヒントを得て、さっそく Ruby で使える Method Finder をこしらえて公開してくださいました。動的言語 and/or 動的システム、万歳!ですね。w

[sumim’s smalltalking-tos - Re: Method Finder for rubyより引用]

Tags: Ruby