Class: TuringTarpit::Evaluator

Inherits:
Object
  • Object
show all
Defined in:
lib/turing_tarpit/evaluator.rb

Constant Summary collapse

CELL_SIZE =
256

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeEvaluator

Returns a new instance of Evaluator.



15
16
17
18
# File 'lib/turing_tarpit/evaluator.rb', line 15

def initialize
  self.pointer_position = 0
  self.cells            = []
end

Instance Attribute Details

#pointer_positionObject

Returns the value of attribute pointer_position.



20
21
22
# File 'lib/turing_tarpit/evaluator.rb', line 20

def pointer_position
  @pointer_position
end

Class Method Details

.run(interpreter) ⇒ Object



5
6
7
8
9
10
11
12
13
# File 'lib/turing_tarpit/evaluator.rb', line 5

def self.run(interpreter)
  evaluator = new

  loop do
    if operation = interpreter.next_operation(evaluator.cell_value)
      evaluator.send(operation)
    end
  end
end

Instance Method Details

#cell_valueObject



22
23
24
# File 'lib/turing_tarpit/evaluator.rb', line 22

def cell_value
  cells[pointer_position] ||= 0
end

#cell_value=(value) ⇒ Object

Raises:



26
27
28
29
30
# File 'lib/turing_tarpit/evaluator.rb', line 26

def cell_value=(value)
  raise InvalidValue unless valid_cell_value?(value)

  cells[pointer_position] = value
end

#decrement_cell_valueObject



36
37
38
# File 'lib/turing_tarpit/evaluator.rb', line 36

def decrement_cell_value
  self.cell_value = (cell_value - 1) % CELL_SIZE
end

#decrement_pointerObject



44
45
46
47
48
# File 'lib/turing_tarpit/evaluator.rb', line 44

def decrement_pointer
  raise PointerBoundaryError unless pointer_position > 0

  self.pointer_position = pointer_position - 1
end

#increment_cell_valueObject



32
33
34
# File 'lib/turing_tarpit/evaluator.rb', line 32

def increment_cell_value
  self.cell_value = (cell_value + 1) % CELL_SIZE
end

#increment_pointerObject



40
41
42
# File 'lib/turing_tarpit/evaluator.rb', line 40

def increment_pointer
  self.pointer_position = pointer_position + 1
end

#input_cell_valueObject



54
55
56
57
58
59
# File 'lib/turing_tarpit/evaluator.rb', line 54

def input_cell_value
  value = $stdin.getch.ord
  return if value.zero?

  self.cell_value = value
end

#output_cell_valueObject



50
51
52
# File 'lib/turing_tarpit/evaluator.rb', line 50

def output_cell_value
  putc(cell_value)
end