123456789101112131415161718192021222324252627282930313233343536373839404142 |
- module Chervil::AST
- class Function
- attr_reader :name
- attr_reader :params
- attr_reader :body
-
- def initialize(name, params, body)
- @name = name
- @params = params
- @body = body
- end
-
- def ==(other)
- @name == other.name && @params == other.params && @body == other.body
- end
-
- def evaluate(env)
- self
- end
-
- def call(args, env)
- unless @params.size == args.size
- raise "Expected #{params.size} arguments but received #{args.size}"
- end
-
- @params.zip(args).each do |key, value|
- env.set(key.name, value)
- end
-
- current_expr = nil
- @body.each do |expr|
- current_expr = expr.evaluate(env)
- end
-
- current_expr
- end
-
- def to_s
- "<function: #{@name.name}(#{@params.map(&:name).join(' ')})>"
- end
- end
- end
|