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]