ujihisaくんが動かない〜って言ってたコード
ですが、こんな感じになるのではないでしょうか。inlineのはよくわからないので普通に拡張ライブラリとして書いてみました。
ファイル: foo.c
#include "ruby.h" static VALUE in_getproc_c(VALUE args, VALUE self) { VALUE x = RARRAY(args)->ptr[0]; double tmp = 1.0 - 10.0 * NUM2DBL(x); return (tmp > 0.0) ? rb_float_new(tmp) : rb_float_new(0.0); } static VALUE getproc_c(void) { return rb_proc_new(in_getproc_c, Qnil); } static VALUE procself_c(VALUE self, VALUE x) { double tmp = 1.0 - 10.0 * NUM2DBL(x); return (tmp > 0.0) ? rb_float_new(tmp) : rb_float_new(0.0); } void Init_foo(void) { rb_define_global_function("getproc_c", getproc_c, 0); rb_define_global_function("procself_c", procself_c, 1); }
ファイル: extconf.rb
require 'mkmf' create_makefile('foo')
ファイル: a.rb
#!/usr/bin/env ruby require 'foo' def getproc_rb lambda {|x| [1.0 - 10 * x, 0.0].max } end def procself_rb(x) [1.0 - 10 * x, 0.0].max end p getproc_rb[0.01] # => 0.9 p procself_rb(0.01) # => 0.9 p getproc_c[0.01] # => 0.9 p procself_c(0.01) # => 0.9
実行例:
$ /usr/bin/ruby -v ruby 1.8.5 (2006-12-25 patchlevel 12) [i386-cygwin] → ごめんなさい。ちょっと古いバージョンですね。。。 $ /usr/bin/ruby extconf.rb creating Makefile $ make gcc -I. -I/usr/lib/ruby/1.8/i386-cygwin -I/usr/lib/ruby/1.8/i386-cygwin -I. -g -O2 -c foo.c gcc -shared -s -Wl,--enable-auto-image-base -Wl,--enable-auto-import,--export-al l -L"/usr/lib" -o foo.so foo.o -lruby -ldl -lcrypt $ /usr/bin/ruby a.rb 0.9 0.9 0.9 0.9