diff options
-rw-r--r-- | parse.rb | 16 | ||||
-rw-r--r-- | patter.rb | 14 | ||||
-rw-r--r-- | readme.textile | 6 |
3 files changed, 22 insertions, 14 deletions
@@ -14,32 +14,26 @@ def sub_vars(string) return outvars.join(", "), blockvars.join(", ") end -def sub_funs(string, funs) - funs.each do |fun| - string.gsub!(/#{fun}\((.*?)\)/, "#{fun}.call(\\1)") - end - return string -end - lines = $stdin.readlines.map(&:chomp) funs = [] puts "require './patter'" +puts "include Patter" puts lines.each do |line| if line =~ /\s*([a-z_][a-zA-Z0-9_]*?)\((.*)\) is\s*$/ then unless funs.include?($1) then funs << $1 - puts "#{$1} = Patter::Fun.new" + puts "patterfun#{$1} = Patter::Fun.new(:#{$1})" end arg, blk = sub_vars($2) if blk.empty? then - puts "#{$1}.when(#{arg}) do" + puts "patterfun#{$1}.when(#{arg}) do" else - puts "#{$1}.when(#{arg}) do |#{blk}|" + puts "patterfun#{$1}.when(#{arg}) do |#{blk}|" end else - puts sub_funs(line, funs) + puts line end end @@ -2,8 +2,14 @@ module Patter class Var; end class Fun - def initialize + def self.find(name) + return $patter_funs[name] + end + + def initialize(name) + $patter_funs = {} unless $patter_funs @patterns = {} + $patter_funs[name] = self end def when(*args, &block) @@ -40,4 +46,10 @@ module Patter raise "Inexhaustive patterns" end end + + def method_missing(name, *args) + if $patter_funs && $patter_funs.include?(name) then + $patter_funs[name].call(*args) + end + end end diff --git a/readme.textile b/readme.textile index a5c25f2..b514d21 100644 --- a/readme.textile +++ b/readme.textile @@ -32,12 +32,14 @@ bc.. $ echo <<. >test.rb require './patter' include Patter -fib = Fun.new +fib = Fun.new(:fibonacci) fib.when(0){1} fib.when(1){1} fib.when(Var) do |n| - fib.call(n-1) + fib.call(n-2) + fibonacci.call(n-1) + fibonacci.call(n-2) end + +puts fibonacci(10) . $ ruby test.rb |