class Keisan::AST::Variable

Attributes

name[R]

Public Class Methods

new(name) click to toggle source
# File lib/keisan/ast/variable.rb, line 6
def initialize(name)
  @name = name
end

Public Instance Methods

==(other) click to toggle source
# File lib/keisan/ast/variable.rb, line 30
def ==(other)
  case other
  when Variable
    name == other.name
  else
    false
  end
end
differentiate(variable, context = nil) click to toggle source
# File lib/keisan/ast/variable.rb, line 73
def differentiate(variable, context = nil)
  context ||= Context.new

  if name == variable.name && !context.has_variable?(name)
    1.to_node
  else
    0.to_node
  end
end
evaluate(context = nil) click to toggle source
# File lib/keisan/ast/variable.rb, line 43
def evaluate(context = nil)
  context ||= Context.new
  if context.has_variable?(name)
    variable = variable_node_from_context(context)

    # The variable might just be a variable, i.e. probably in function definition
    if variable.is_a?(Node)
      variable.is_a?(Variable) ? variable : variable.evaluate(context)
    else
      variable
    end
  else
    self
  end
end
replace(variable, replacement) click to toggle source
# File lib/keisan/ast/variable.rb, line 68
def replace(variable, replacement)
  to_replace_name = variable.is_a?(::String) ? variable : variable.name
  name == to_replace_name ? replacement : self
end
simplify(context = nil) click to toggle source
# File lib/keisan/ast/variable.rb, line 59
def simplify(context = nil)
  context ||= Context.new
  if context.has_variable?(name)
    context.variable(name).to_node.simplify(context)
  else
    self
  end
end
to_s() click to toggle source
# File lib/keisan/ast/variable.rb, line 39
def to_s
  name.to_s
end
unbound_variables(context = nil) click to toggle source
# File lib/keisan/ast/variable.rb, line 25
def unbound_variables(context = nil)
  context ||= Context.new
  context.has_variable?(name) ? Set.new : Set.new([name])
end
value(context = nil) click to toggle source
# File lib/keisan/ast/variable.rb, line 14
def value(context = nil)
  context ||= Context.new
  node = variable_node_from_context(context)
  case node
  when Variable
    node
  else
    node.value(context)
  end
end
variable_truthy?(context) click to toggle source
# File lib/keisan/ast/variable.rb, line 10
def variable_truthy?(context)
  context.has_variable?(name) && context.variable(name).true?
end

Private Instance Methods

variable_node_from_context(context) click to toggle source
# File lib/keisan/ast/variable.rb, line 85
def variable_node_from_context(context)
  variable = context.variable(name)
  variable = variable.node if variable.is_a?(Cell)
  variable
end