require 'ostruct'
class Proc
alias === call
end
class Env
def list(x, xs)
lambda{|list|
Array === list && lambda{|list|
_.x, *_.xs = list
true
}.call(list)
}
end
def _
@mdata[-1]
end
def match(thing)
r= OpenStruct.new
r._obj = thing
@mdata.push(r)
yield
@mdata.pop.ret
end
def _case(a)
return if _.break
if a === _._obj
_.ret = yield
_.break = true
end
end
def reverse list
match list do
_case [] do [] end
_case list(:x, :xs) do reverse(_.xs) << _.x end
end
end
def test
@mdata = []
p reverse([1,2,3,4,5])
end
end
Env.new.test