2007-11-28
require "continuation"
なんだってー cho3 に教えて貰った知らなかった!!!これで 1.9 でも callcc が(でも使わない方が良い?)
String#to_proc を実装してみる
- http://www.rubyist.net/~matz/20071030.html#p04
- http://weblog.raganwald.com/2007/10/stringtoproc.html
String#to_proc はどうなんだろうという話。ここからいろいろ跳んで id:cho45 と eigenclass - 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 使わずに取得する方法ってあるんだっけ?)