lib/dentaku/calculator.rb in dentaku-2.0.11 vs lib/dentaku/calculator.rb in dentaku-3.0.0

- old
+ new

@@ -19,14 +19,10 @@ def self.add_function(name, type, body) Dentaku::AST::FunctionRegistry.default.register(name, type, body) end - def add_functions(fns) - fns.each { |(name, type, body)| add_function(name, type, body) } - end - def add_function(name, type, body) @function_registry.register(name, type, body) self end @@ -42,18 +38,23 @@ @disable_ast_cache = false end def evaluate(expression, data={}) evaluate!(expression, data) - rescue UnboundVariableError, ArgumentError + rescue UnboundVariableError, Dentaku::ArgumentError yield expression if block_given? end def evaluate!(expression, data={}) store(data) do node = expression node = ast(node) unless node.is_a?(AST::Node) + unbound = node.dependencies - memory.keys + unless unbound.empty? + raise UnboundVariableError.new(unbound), + "no value provided for variables: #{unbound.join(', ')}" + end node.value(memory) end end def solve!(expression_hash) @@ -83,10 +84,10 @@ when String @ast_cache.delete(pattern) when Regexp @ast_cache.delete_if { |k,_| k =~ pattern } else - fail Dentaku::ArgumentError + raise ::ArgumentError end end def store(key_or_hash, value=nil) restore = Hash[memory]