Elias Athanasopoulos wrote: > Hello! > > Is there a fast way to create prototypes such: > > def foo(bar=0) > ... > end > > in a Ruby extension? Or I have to use: > > rb_define_method(foo, "...", func, -1); > > and parse the variables using rb_scan_args()? If you don't mind taking a code generation approach, there is a way to make rb_define_method and rb_scan_args a bit more palatable. My cgen library on RAA gives you ruby methods for generating a ruby extension in C. A simple example: =============== require 'cgen/cshadow' class MyComplex2 < Numeric include CShadow shadow_attr_accessor :re => "double re", :im => "double im" def initialize re, im self.re = re self.im = im end define_c_method(:abs) { include "<math.h>" returns "rb_float_new(sqrt(pow(shadow->re, 2) + pow(shadow->im, 2)))" } define_c_method(:scale!) { c_array_args { optional :factor default :factor => "INT2NUM(10)" typecheck :factor => Numeric } body %{ shadow->re *= NUM2DBL(factor); shadow->im *= NUM2DBL(factor); } returns "self" } end require 'ftools' dir = File.join("tmp", RUBY_VERSION) File.mkpath dir Dir.chdir dir do MyComplex2.commit end MyComplex2.commit # compiles and load the library z = MyComplex2.new 5, 1.3 puts z.abs # ==> 5.1662365412358 z.scale! 3.0 # float p [z.re, z.im] # ==> [15.0, 3.9] z.scale! 3 # int p [z.re, z.im] # ==> [45.0, 11.7] z.scale! # use default value p [z.re, z.im] # ==> [450.0, 117] =============== CShadow also takes care of load/dump/mark/free/alloc/new as well as accessors with type conversion/checking.