A Day in the Life

2007-11-28

require "continuation"

なんだってー cho3 に教えて貰った知らなかった!!!これで 1.9 でも callcc が(でも使わない方が良い?)

String#to_proc を実装してみる

String#to_proc はどうなんだろうという話。ここからいろいろ跳んで id:cho45eigenclass - Changes in Ruby 1.9 読んでたら 1.9 に期待まくり!!!ということで眠れなくなってきたのでリンク先にも実装してあるが自分も String#to_proc を手抜き実装してみる。

$ ruby1.9 --version
ruby 1.9.0 (2007-10-16 patchlevel 0) [i486-linux]

な sid の 1.9 で確認。

class String
  def to_proc(binding = nil)
    if m = match('->')
      prefix = m.pre_match.strip.split(/\s+/).join(', ')
      postfix = m.post_match.strip
      eval "-> (#{prefix}) {#{postfix}}", binding
    else
      eval "-> (#{scan(/\w+/)[0]}) {#{self}}", binding
    end
  end
end
puts 'x y -> x * y'.to_proc.(2, 5) #=> 10
square = 'x*x'.to_proc
puts square.(3) #=> 9
puts square.(5) #=> 25
puts 'x y -> x+2*y'.to_proc[2, 3] #=> 8

[1,2,3].map &'x*x' #=> [1,4,9]

a = 10
puts 'x -> x * a'.to_proc(binding).(5) #=> 50

eval!eval!;( binding が String のインスタンスになるけど、割と普通に動いてしまう。(呼び出された箇所の binding を block や 呼び出し元の binding 使わずに取得する方法ってあるんだっけ?)

記事の一覧 >