12345678910111213141516171819202122232425262728293031323334 |
- 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.is_a?(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
- elsif head.is_a?(Function)
- head.call(@elements[1..-1].map { |arg| arg.evaluate(env) }, env)
- else
- @elements.map { |el| el.evaluate(env) }
- end
- end
- end
- end
- end
|