ÇÛÎó¥ê¥Æ¥é¥ë([1,2,3]¤Î¤è¤¦¤ÊÇÛÎó¤Î¤³¤È¤ò¤³¤¦¸Æ¤Ö¤é¤·¤¤)¤Îinitialize¾å½ñ¤¤Ï̵Íý¤Ã¤Ý¤¤¤Î¤ÇÄü¤á¤Æ¡¢¥³¡¼¥É¤òÀ°Íý¤·¤Æ¤ß¤Þ¤·¤¿¡Ê¤Ä¤¤¤Ç¤Ë¥Ð¥°¼è¤ê¤â¡Ë¡£
ÍѸì¤Ï¤³¤Á¤é¤ò»²¹Í¤Ë¤µ¤»¤ÆÄº¤¤Þ¤·¤¿¡£
½ñ¼°¡§
I['value_expression' | 'var <- source', 'predicate_1', 'predicate_2', ¡¦¡¦¡¦, 'predicate_n']
¤³¤Î¼°¤Ï°Ê²¼¤Î¤è¤¦¤Ê¼°¤ËŸ³«¤µ¤ì¤Þ¤¹¡£
source.select do |var|
predicate_1(var) && predicate_2(var) && ¡¦¡¦¡¦ && predicate_n(var)
end.map do |var|
value_expression(var)
end
Îã1:
xs = [10,30,3,-5,1,10,100,-60]
p I['(x*2).abs' | 'x<-xs', 'x < 50']
=> [20, 60, 6, 10, 2, 20, 120]
Îã2:
def quicksort(x = nil, *xs)
return [] if x == nil
quicksort(*I['y' | 'y <- xs', 'y < x']) + [x] + quicksort(*I['y' | 'y <- xs', 'y >= x'])
end
p quicksort(*xs)
=> [-60, -5, 1, 3, 10, 10, 30, 100]
¥³¡¼¥É¤Ï¤³¤Á¤é¡§
require 'active_support/binding_of_caller'
class Intention
def initialize(value_expression, var, source)
@value_expression = value_expression
@var = var
@source = source
end
def to_a(predicates, binding)
predicates << 'true' if predicates == []
eval(<<-EOF, binding)
#@source.select {|#@var| #{predicates.join('&&')} }.map do |#@var|
#@value_expression
end
EOF
end
end
class String
def |(other)
raise unless other =~ /^(.+)<-(.+)$/
Intention.new(self, $1, $2)
end
end
class I
def self.[](intention, *predicates)
raise unless intention.instance_of?(Intention)
Binding.of_caller do |binding|
intention.to_a(predicates, binding)
end
end
end