Class: Factbase::Term

Inherits:
Object
  • Object
show all
Includes:
Aggregates, Aliases, Casting, Debug, Defn, Logical, Math, Meta, Ordering, Strings, System
Defined in:
lib/factbase/term.rb

Overview

Term.

This is an internal class, it is not supposed to be instantiated directly.

It is possible to use for testing directly, for example to make a term with two arguments:

require 'factbase/fact'
require 'factbase/term'
f = Factbase::Fact.new(Mutex.new, { 'foo' => [42, 256, 'Hello, world!'] })
t = Factbase::Term.new(:lt, [:foo, 50])
assert(t.evaluate(f))

The design of this class may look ugly, since it has a large number of methods, each of which corresponds to a different type of a Term. A much better design would definitely involve many classes, one per each type of a term. It’s not done this way because of an experimental nature of the project. Most probably we should keep current design intact, since it works well and is rather simple to extend (by adding new term types). Moreover, it looks like the number of possible term types is rather limited and currently we implement most of them.

Author

Yegor Bugayenko ([email protected])

Copyright

Copyright © 2024 Yegor Bugayenko

License

MIT

Defined Under Namespace

Modules: Aggregates, Aliases, Casting, Debug, Defn, Logical, Math, Meta, Ordering, Strings, System

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Debug

#traced

Methods included from System

#env

Methods included from Defn

#defn, #undef

Methods included from Ordering

#prev, #unique

Methods included from Aliases

#as, #join

Methods included from Meta

#absent, #exists, #many, #nil, #one, #size, #type

Methods included from Casting

#to_float, #to_integer, #to_string, #to_time

Methods included from Strings

#concat, #matches, #sprintf

Methods included from Aggregates

#agg, #best, #count, #empty, #first, #max, #min, #nth, #sum

Methods included from Logical

#_only_bool, #always, #and, #and_or_simplify, #and_simplify, #either, #never, #not, #or, #or_simplify, #when

Methods included from Math

#arithmetic, #cmp, #div, #eq, #gt, #gte, #lt, #lte, #minus, #plus, #times, #zero

Constructor Details

#initialize(operator, operands) ⇒ Term

Ctor.

Parameters:

  • operator (Symbol)

    Operator

  • operands (Array)

    Operands



92
93
94
95
# File 'lib/factbase/term.rb', line 92

def initialize(operator, operands)
  @op = operator
  @operands = operands
end

Instance Attribute Details

#opObject (readonly)

Returns the value of attribute op.



54
55
56
# File 'lib/factbase/term.rb', line 54

def op
  @op
end

#operandsObject (readonly)

Returns the value of attribute operands.



54
55
56
# File 'lib/factbase/term.rb', line 54

def operands
  @operands
end

Instance Method Details

#evaluate(fact, maps) ⇒ bool

Does it match the fact?

Parameters:

Returns:

  • (bool)

    TRUE if matches



101
102
103
104
105
106
107
# File 'lib/factbase/term.rb', line 101

def evaluate(fact, maps)
  send(@op, fact, maps)
rescue NoMethodError => e
  raise "Probably the term '#{@op}' is not defined at #{self}:\n#{Backtrace.new(e)}"
rescue StandardError => e
  raise "#{e.message} at #{self}:\n#{Backtrace.new(e)}"
end

#simplifyFactbase::Term

Simplify it if possible.

Returns:



111
112
113
114
115
116
117
118
# File 'lib/factbase/term.rb', line 111

def simplify
  m = "#{@op}_simplify"
  if respond_to?(m, true)
    send(m)
  else
    self
  end
end

#to_sString

Turns it into a string.

Returns:

  • (String)

    The string of it



122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/factbase/term.rb', line 122

def to_s
  items = []
  items << @op
  items +=
    @operands.map do |o|
      if o.is_a?(String)
        "'#{o.gsub("'", "\\\\'").gsub('"', '\\\\"')}'"
      elsif o.is_a?(Time)
        o.utc.iso8601
      else
        o.to_s
      end
    end
  "(#{items.join(' ')})"
end