module Chervil::AST class List attr_reader :elements def initialize(elements) @elements = elements end def ==(other) @elements == other.elements end def evaluate(env) if elements.empty? [] else head = @elements.first if head.class == Identifier function = env.get(head.name) if function.nil? ::Chervil::Error.new("Unbound variable #{head.name}") else function.call(@elements[1..-1].map { |arg| arg.evaluate(env) }, env) end else @elements.map { |el| el.evaluate(env) } end end end end end