From dbb55f88451d27c4343da544e2a6577897bd7bd8 Mon Sep 17 00:00:00 2001 From: Nat Lasseter Date: Fri, 16 Feb 2018 16:33:10 +0000 Subject: Making things much worse but functions are now callable --- parse.rb | 16 +++++----------- patter.rb | 14 +++++++++++++- readme.textile | 6 ++++-- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/parse.rb b/parse.rb index 0625c15..bb8cbec 100644 --- a/parse.rb +++ b/parse.rb @@ -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 diff --git a/patter.rb b/patter.rb index 348cbdf..282af46 100644 --- a/patter.rb +++ b/patter.rb @@ -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 -- cgit v1.2.1