# File lib/ruote/exp/condition.rb, line 123
    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
        # TODO : consider returning false

      #require 'ruby2ruby'
      #Ruby2Ruby.new.process(Sexp.from_array(tree))
        # returns the raw Ruby as a String
        # it's nice but "Loan/Grant" becomes "(Loan / Grant)"
    end