def self.evl(tree)
return evl(parse(tree)) if tree.is_a?(String)
return nil if tree == []
return tree.last if tree.first == :str
return tree.last if tree.first == :lit
return tree.last.to_s if tree.first == :const
return nil if tree == [ :nil ]
return true if tree == [ :true ]
return false if tree == [ :false ]
return ( ! evl(tree.last)) if tree.first == :not
return evl(tree[1]) && evl(tree[2]) if tree[0] == :and
return evl(tree[1]) || evl(tree[2]) if tree[0] == :or
return tree[1..-1].collect { |e| evl(e) } if tree[0] == :array
return Hash.[](*tree[1..-1].collect { |e| evl(e) }) if tree[0] == :hash
if tree[0] == :match3
return evl(tree[2]) =~ evl(tree[1])
end
if tree[0] == :call && tree[2] == :=~
return evl(tree[1]) =~ Regexp.new(evl(tree.last.last).to_s)
end
if tree[0] == :call && COMPARATORS.include?(tree[2])
return evl(tree[1]).send(tree[2], evl(tree.last.last))
end
if (c = flatten_and_compare(tree)) != nil
return c
end
if tree[0] == :call
return flatten(tree)
end
raise ArgumentError
end