Wrapping a C Function as a Block

RedHanded From RedHanded, 1 year ago, 0 views

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.prefix %{
 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.

comments

No comments yet.

You must be logged in to add your own comment.