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

参照: ライブドアブログ(livedoor Blog)| 読みたいブログが見つかる