Hi,

sorry for late response.

Why don't you use rb_define_method() instead of calling "define_method"?

"define_method" is desgined for "ruby level", not for C level.


Paul Brannan wrote:
> This works in Ruby (1.9):
> 
> irb(main):002:0> class Foo; define_method(:foo) { |x, &b| p x, b }; end
> => #<Proc:0xb7cb2cf0@(irb):2 (lambda)>
> irb(main):004:0> Foo.new.foo(42) { 8 }
> 42
> 
> but I don't see how to duplicate this behavior in C:
> 
> cout@bean:~/tmp/tmp$ cat foo.c
> #include "ruby.h"
> 
> VALUE foo(VALUE yieldarg, VALUE procarg)
> {
>   rb_p(yieldarg);
>   rb_p(procarg);
>   rb_p(rb_block_proc());
>   return Qnil;
> }
> 
> VALUE dm(VALUE id)
> {
>   VALUE args[] = { id };
>   rb_funcall2(rb_cObject, rb_intern("define_method"), 1, args);
> }
> 
> void Init_foo()
> {
>   VALUE val = INT2NUM(42);
>   rb_iterate(dm, ID2SYM(rb_intern("foo")), foo, val);
> }
> 
> cout@bean:~/tmp/tmp$ cat test.rb
> require 'foo'
> 
> foo { puts "HERE" }
> 
> cout@bean:~/tmp/tmp$ ruby1.9 test.rb
> nil
> 42
> test.rb:3:in `<main>': tried to create Proc object without a block (ArgumentError)
> 
> Is what I want possible?
> 
> Paul
> 
> 


-- 
// SASADA Koichi at atdot dot net