This post originated from an RSS feed registered with Ruby Buzz
by Red Handed.
Original Post: Wrapping a C Function as a Block
Feed Title: RedHanded
Feed URL: http://redhanded.hobix.com/index.xml
Feed Description: sneaking Ruby through the system
I had previously been using rb_iterate and a call to Proc.new to build a block in C. But that takes two function calls while the undocumented rb_proc_new is just one.
require 'rubygems'
require 'inline'
module Kernel
inline do |ext|
ext.c_raw %{
static VALUE sum(VALUE args)
{
return rb_funcall(rb_ary_entry(args, 0), rb_intern("+"), 1,
rb_ary_entry(args, 1));
return Qnil;
}
}
ext.c %{
VALUE sum_block()
{
return rb_proc_new(sum, 0);
}
}
end
end
p sum_block[13, 2]
p (0..20).inject(0, &sum_block)
Most of the time rb_iterate is what you need. But, you know, in case you actually want a Proc object.