Class: Skeem::SkmConditional

Inherits:
SkmMultiExpression show all
Defined in:
lib/skeem/s_expr_nodes.rb

Overview

class

Instance Attribute Summary collapse

Attributes inherited from SkmElement

#position

Instance Method Summary collapse

Methods inherited from SkmMultiExpression

#accept, #associations

Methods inherited from SkmElement

#accept, #boolean?, #bound!, #callable?, #char?, #complex?, #done!, #eqv?, #integer?, #list?, #null?, #number?, #pair?, #procedure?, #quoted!, #rational?, #real?, #skm_eq?, #skm_equal?, #string?, #symbol?, #unquoted!, #vector?, #verbatim?

Constructor Details

#initialize(aPosition, theClauses, anAlternate) ⇒ SkmConditional

Returns a new instance of SkmConditional.



248
249
250
251
252
# File 'lib/skeem/s_expr_nodes.rb', line 248

def initialize(aPosition, theClauses, anAlternate)
  super(aPosition)
  @clauses = theClauses
  @alternate = anAlternate
end

Instance Attribute Details

#alternateObject (readonly)

Returns the value of attribute alternate.



246
247
248
# File 'lib/skeem/s_expr_nodes.rb', line 246

def alternate
  @alternate
end

#clausesObject (readonly)

An array of couples [test, sequence]



245
246
247
# File 'lib/skeem/s_expr_nodes.rb', line 245

def clauses
  @clauses
end

Instance Method Details

#evaluate(aRuntime) ⇒ Object



254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
# File 'lib/skeem/s_expr_nodes.rb', line 254

def evaluate(aRuntime)
  clause_matching = false
  result = nil

  clauses.each do |(test, consequent)|
    test_result = test.evaluate(aRuntime)
    next if test_result.boolean? && test_result.value == false

    clause_matching = true
    result = consequent.evaluate(aRuntime)
    break
  end

  unless clause_matching
    result = alternate ? alternate.evaluate(aRuntime) : SkmUndefined.instance
  end

  result
end

#inspectObject



285
286
287
288
289
290
291
292
293
# File 'lib/skeem/s_expr_nodes.rb', line 285

def inspect
  result = "#{inspect_prefix}@test #{test.inspect} , "
  result << "@clauses \n"
  clauses.each do |(test, consequent)|
    result << '  ' << test.inspect << ' ' << consequent.inspect << "\n"
  end
  result << "@alternate #{alternate.inspect}#{inspect_suffix}"
  result
end

#quasiquote(aRuntime) ⇒ Object



274
275
276
277
278
279
280
281
282
283
# File 'lib/skeem/s_expr_nodes.rb', line 274

def quasiquote(aRuntime)
  quasi_clauses = clauses.map do |(test, consequent)|
      test_qq = test.quasiquote(aRuntime)
      consequent_qq = consequent.quasiquote(aRuntime)
      [test_qq, consequent_qq]
  end
  quasi_alternate = alternate ? alternate.quasiquote(aRuntime) : nil

  self.class.new(position, quasi_clauses, quasi_alternate)
end