Project

General

Profile

Feature #10195

Updated by nobu (Nobuyoshi Nakada) over 9 years ago

I'm developing a Haskell binding to the Ruby C API. Unfortunately, `rb_proc_new` rb_proc_new 
 does not provide any means of accessing super, self and/or any passed block. A 
 better alternative to `rb_proc_new` rb_proc_new would make it possible to create procs from 
 C/Haskell/etc that can access `self`/`super`/&`block`. self/super/&block. 

 I'm currently hacking around this lacking in the C API by creating a closure 
 from the Ruby side that closes over self et al - a trampoline of sorts: 

 ~~~ 
   rupee_proc_constructor_with_super = rb_eval_string_protect( 
       "Proc.new {|callable|\n" 
       "    su = if defined?(super)\n" 
       "           Proc.new {|*args,&blk| super(*args,&blk) }\n" 
       "         else\n" 
       "           nil\n" 
       "         end\n" 
       "    Proc.new {|*args,&blk|\n" 
       "      callable.call(self, su, *args, &blk)\n" 
       "    }\n" 
       "}", 
       &status); 
 ~~~ 

 From the Haskell side, I then pass in the `callable' object, where `callable#call` callable#call 
 is implemented in Haskell. This is pretty clunky/slow, and also creates 
 unintuitive behavior from the Haskell side. It would be ideal for the C API to 
 support this natively.

Back