gobstones 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (168) hide show
  1. checksums.yaml +5 -5
  2. data/.rubocop.yml +133 -0
  3. data/.rubocop_todo.yml +75 -0
  4. data/.simplecov +1 -3
  5. data/.tool-versions +1 -0
  6. data/.travis.yml +9 -2
  7. data/Gemfile +11 -5
  8. data/Gemfile.lock +65 -39
  9. data/README.md +8 -1
  10. data/Rakefile +1 -1
  11. data/bin/gobstones +1 -1
  12. data/gobstones.gemspec +12 -11
  13. data/lib/gobstones/cli/printer.rb +41 -28
  14. data/lib/gobstones/cli/runner.rb +50 -15
  15. data/lib/gobstones/extensions/all.rb +1 -1
  16. data/lib/gobstones/extensions/boolean.rb +1 -5
  17. data/lib/gobstones/extensions/{fixnum.rb → integer.rb} +2 -4
  18. data/lib/gobstones/extensions/string.rb +1 -3
  19. data/lib/gobstones/lang/all.rb +3 -3
  20. data/lib/gobstones/lang/commands/all.rb +11 -10
  21. data/lib/gobstones/lang/commands/boom.rb +26 -0
  22. data/lib/gobstones/lang/commands/command_block.rb +23 -23
  23. data/lib/gobstones/lang/commands/conditional.rb +26 -0
  24. data/lib/gobstones/lang/commands/if.rb +13 -0
  25. data/lib/gobstones/lang/commands/if_then_else.rb +26 -0
  26. data/lib/gobstones/lang/commands/ir_al_origen.rb +15 -0
  27. data/lib/gobstones/lang/commands/mover.rb +23 -0
  28. data/lib/gobstones/lang/commands/multiple_assignment.rb +34 -21
  29. data/lib/gobstones/lang/commands/poner.rb +31 -0
  30. data/lib/gobstones/lang/commands/procedure_call.rb +8 -8
  31. data/lib/gobstones/lang/commands/repeat_with.rb +69 -0
  32. data/lib/gobstones/lang/commands/sacar.rb +29 -0
  33. data/lib/gobstones/lang/commands/single_assignment.rb +15 -20
  34. data/lib/gobstones/lang/commands/skip.rb +15 -0
  35. data/lib/gobstones/lang/commands/vaciar_tablero.rb +15 -0
  36. data/lib/gobstones/lang/commands/while.rb +20 -0
  37. data/lib/gobstones/lang/definitions/definition.rb +16 -23
  38. data/lib/gobstones/lang/definitions/definition_call.rb +7 -15
  39. data/lib/gobstones/lang/definitions/function.rb +1 -7
  40. data/lib/gobstones/lang/definitions/main.rb +1 -8
  41. data/lib/gobstones/lang/definitions/no_return_statement.rb +2 -8
  42. data/lib/gobstones/lang/definitions/procedure.rb +1 -7
  43. data/lib/gobstones/lang/definitions/return_from_function.rb +6 -13
  44. data/lib/gobstones/lang/definitions/return_from_main.rb +15 -10
  45. data/lib/gobstones/lang/definitions/var_tuple.rb +10 -12
  46. data/lib/gobstones/lang/expressions/arithmetic_expressions.rb +17 -27
  47. data/lib/gobstones/lang/expressions/boolean_expressions.rb +4 -10
  48. data/lib/gobstones/lang/expressions/comparison_expressions.rb +0 -16
  49. data/lib/gobstones/lang/expressions/enclosed_by_parens_expression.rb +3 -5
  50. data/lib/gobstones/lang/expressions/expression.rb +18 -0
  51. data/lib/gobstones/lang/expressions/function_call.rb +9 -6
  52. data/lib/gobstones/lang/expressions/one_arg_expression.rb +8 -16
  53. data/lib/gobstones/lang/expressions/primitive_functions.rb +24 -16
  54. data/lib/gobstones/lang/expressions/two_arg_expression.rb +9 -16
  55. data/lib/gobstones/lang/expressions/type_bound_functions.rb +30 -25
  56. data/lib/gobstones/lang/expressions/var_name.rb +9 -13
  57. data/lib/gobstones/lang/literals/all.rb +3 -3
  58. data/lib/gobstones/lang/literals/{booleans.rb → boolean.rb} +24 -22
  59. data/lib/gobstones/lang/literals/{colors.rb → color.rb} +4 -14
  60. data/lib/gobstones/lang/literals/{directions.rb → direction.rb} +3 -13
  61. data/lib/gobstones/lang/literals/literal.rb +35 -27
  62. data/lib/gobstones/lang/literals/number.rb +6 -8
  63. data/lib/gobstones/lang/program.rb +9 -16
  64. data/lib/gobstones/modules/equality_definition.rb +23 -0
  65. data/lib/gobstones/parser/ast/ast.rb +48 -70
  66. data/lib/gobstones/parser/parse_error.rb +2 -7
  67. data/lib/gobstones/parser/treetop_parser.rb +9 -14
  68. data/lib/gobstones/runner/board.rb +12 -15
  69. data/lib/gobstones/runner/cell.rb +14 -20
  70. data/lib/gobstones/runner/errors/all.rb +1 -1
  71. data/lib/gobstones/runner/errors/boom_error.rb +0 -5
  72. data/lib/gobstones/runner/errors/definition_not_found_error.rb +7 -7
  73. data/lib/gobstones/runner/errors/empty_cell_error.rb +0 -5
  74. data/lib/gobstones/runner/errors/gobstones_runtime_error.rb +0 -5
  75. data/lib/gobstones/runner/errors/gobstones_type_error.rb +2 -7
  76. data/lib/gobstones/runner/errors/out_of_board_error.rb +0 -5
  77. data/lib/gobstones/runner/errors/undefined_variable_error.rb +6 -4
  78. data/lib/gobstones/runner/errors/wrong_arguments_error.rb +0 -5
  79. data/lib/gobstones/runner/execution_context.rb +16 -33
  80. data/lib/gobstones/runner/head.rb +17 -20
  81. data/lib/gobstones/runner/program_result.rb +12 -0
  82. data/lib/gobstones/type_check_result.rb +0 -4
  83. data/spec/lang/commands/boom_spec.rb +7 -0
  84. data/spec/lang/commands/command_block_spec.rb +15 -0
  85. data/spec/lang/commands/if_spec.rb +32 -0
  86. data/spec/lang/commands/if_then_else_spec.rb +19 -0
  87. data/spec/lang/commands/ir_al_origen_spec.rb +11 -0
  88. data/spec/lang/commands/mover_spec.rb +30 -0
  89. data/spec/lang/commands/multiple_assignment_spec.rb +39 -22
  90. data/spec/lang/commands/poner_spec.rb +27 -0
  91. data/spec/lang/commands/procedure_call_spec.rb +26 -28
  92. data/spec/lang/commands/procedure_spec.rb +32 -32
  93. data/spec/lang/commands/repeat_with_spec.rb +64 -0
  94. data/spec/lang/commands/sacar_spec.rb +32 -0
  95. data/spec/lang/commands/single_assignment_spec.rb +5 -6
  96. data/spec/lang/commands/skip_spec.rb +10 -0
  97. data/spec/lang/commands/vaciar_tablero_spec.rb +10 -0
  98. data/spec/lang/commands/while_spec.rb +39 -0
  99. data/spec/lang/definitions/main_spec.rb +34 -0
  100. data/spec/lang/definitions/no_return_statement_spec.rb +4 -5
  101. data/spec/lang/definitions/var_tuple_spec.rb +4 -7
  102. data/spec/lang/expressions/arithmetic_expressions_spec.rb +37 -64
  103. data/spec/lang/expressions/boolean_expressions_spec.rb +25 -34
  104. data/spec/lang/expressions/comparison_expressions_spec.rb +109 -155
  105. data/spec/lang/expressions/enclosed_by_parens_expression_spec.rb +3 -7
  106. data/spec/lang/expressions/function_call_spec.rb +24 -20
  107. data/spec/lang/expressions/primitive_functions_spec.rb +28 -39
  108. data/spec/lang/expressions/type_bound_functions_spec.rb +10 -18
  109. data/spec/lang/expressions/var_name_spec.rb +8 -12
  110. data/spec/lang/literals/{booleans_spec.rb → boolean_spec.rb} +3 -5
  111. data/spec/lang/literals/color_spec.rb +19 -0
  112. data/spec/lang/literals/direction_spec.rb +46 -0
  113. data/spec/lang/literals/{numbers_spec.rb → number_spec.rb} +3 -4
  114. data/spec/matchers/parse_matcher.rb +9 -11
  115. data/spec/parser/arithmetic_expressions_spec.rb +51 -61
  116. data/spec/parser/assignments_spec.rb +21 -31
  117. data/spec/parser/boolean_expressions_spec.rb +35 -43
  118. data/spec/parser/command_block_spec.rb +18 -20
  119. data/spec/parser/data_types_spec.rb +9 -19
  120. data/spec/parser/function_calls_spec.rb +19 -19
  121. data/spec/parser/function_definitions_spec.rb +17 -22
  122. data/spec/parser/gobstones_program_spec.rb +30 -30
  123. data/spec/parser/if_command_spec.rb +19 -28
  124. data/spec/parser/main_definition_spec.rb +13 -16
  125. data/spec/parser/nested_expressions_spec.rb +20 -24
  126. data/spec/parser/primitive_expressions_spec.rb +33 -38
  127. data/spec/parser/procedure_calls_spec.rb +17 -18
  128. data/spec/parser/procedure_definitions_spec.rb +12 -15
  129. data/spec/parser/repeat_with_command_spec.rb +10 -10
  130. data/spec/parser/simple_commands_spec.rb +23 -37
  131. data/spec/parser/treetop_parser_spec.rb +87 -83
  132. data/spec/parser/var_tuple_spec.rb +8 -12
  133. data/spec/parser/while_command_spec.rb +11 -14
  134. data/spec/runner/board_spec.rb +28 -33
  135. data/spec/runner/cell_spec.rb +21 -28
  136. data/spec/runner/execution_context_spec.rb +18 -35
  137. data/spec/runner/head_spec.rb +54 -60
  138. data/spec/spec_helper.rb +10 -1
  139. data/spec/support/board_assertions.rb +18 -0
  140. data/spec/{gobstones_lang_test_objects.rb → support/gobstones_lang_test_objects.rb} +6 -4
  141. data/spec/type_checker_spec.rb +19 -25
  142. metadata +80 -56
  143. data/.ruby-version +0 -1
  144. data/lib/gobstones/lang/commands/boom_cmd.rb +0 -31
  145. data/lib/gobstones/lang/commands/conditional_cmd.rb +0 -31
  146. data/lib/gobstones/lang/commands/if_cmd.rb +0 -38
  147. data/lib/gobstones/lang/commands/ir_al_origen_cmd.rb +0 -19
  148. data/lib/gobstones/lang/commands/mover_cmd.rb +0 -27
  149. data/lib/gobstones/lang/commands/poner_cmd.rb +0 -35
  150. data/lib/gobstones/lang/commands/repeat_with_cmd.rb +0 -77
  151. data/lib/gobstones/lang/commands/sacar_cmd.rb +0 -33
  152. data/lib/gobstones/lang/commands/skip_cmd.rb +0 -19
  153. data/lib/gobstones/lang/commands/vaciar_tablero_cmd.rb +0 -19
  154. data/lib/gobstones/lang/commands/while_cmd.rb +0 -25
  155. data/lib/gobstones/modules/equal_by_class.rb +0 -13
  156. data/spec/lang/commands/boom_cmd_spec.rb +0 -8
  157. data/spec/lang/commands/cmd_block_spec.rb +0 -21
  158. data/spec/lang/commands/if_cmd_spec.rb +0 -50
  159. data/spec/lang/commands/ir_al_origen_cmd_spec.rb +0 -16
  160. data/spec/lang/commands/mover_cmd_spec.rb +0 -36
  161. data/spec/lang/commands/poner_cmd_spec.rb +0 -28
  162. data/spec/lang/commands/repeat_with_cmd_spec.rb +0 -60
  163. data/spec/lang/commands/sacar_cmd_spec.rb +0 -35
  164. data/spec/lang/commands/skip_cmd_spec.rb +0 -12
  165. data/spec/lang/commands/vaciar_tablero_cmd_spec.rb +0 -14
  166. data/spec/lang/commands/while_cmd_spec.rb +0 -43
  167. data/spec/lang/literals/colors_spec.rb +0 -13
  168. data/spec/lang/literals/directions_spec.rb +0 -45
@@ -1,30 +1,46 @@
1
- require 'gobstones/lang/literals/colors'
1
+ require 'gobstones/lang/literals/color'
2
2
 
3
3
  module Gobstones
4
-
5
4
  module CLI
6
-
7
5
  class Printer
8
-
9
6
  TEMPLATE = File.read(File.dirname(__FILE__) + '/board_template')
10
7
 
11
- def initialize(context)
12
- @context = context
8
+ def initialize(program_result)
9
+ @program_result = program_result
13
10
  @board = TEMPLATE
14
11
  end
15
12
 
16
13
  def print
17
14
  highlight_current_cell
18
15
  put_ball_values
16
+ print_return_values
17
+ print_board
18
+ end
19
+
20
+ def print_return_values
21
+ @program_result.return_values.each do |variable, value|
22
+ puts "#{variable.name} => #{value}"
23
+ end
24
+ end
25
+
26
+ def print_board
19
27
  puts @board
20
28
  end
21
29
 
22
30
  private
23
31
 
32
+ def head
33
+ @program_result.head
34
+ end
35
+
36
+ def board
37
+ head.board
38
+ end
39
+
24
40
  def highlight_current_cell
25
41
  char = 'X'
26
- x = @context.head.x_pos
27
- y = @context.head.y_pos
42
+ x = head.x_pos
43
+ y = head.y_pos
28
44
  highlight_row x, y, char
29
45
  highlight_row x, y - 1, char
30
46
  highlight_column x, y, char
@@ -34,38 +50,38 @@ module Gobstones
34
50
  def put_ball_values
35
51
  total_rows.times do |x|
36
52
  total_columns.times do |y|
37
- put_ball_value @context.board.number_of_balls(x, y, Gobstones::Lang::Negro.new), 'N', x, y, 2, 1
38
- put_ball_value @context.board.number_of_balls(x, y, Gobstones::Lang::Azul.new) , 'A', x, y, 6, 1
39
- put_ball_value @context.board.number_of_balls(x, y, Gobstones::Lang::Verde.new), 'V', x, y, 2, 3
40
- put_ball_value @context.board.number_of_balls(x, y, Gobstones::Lang::Rojo.new) , 'R', x, y, 6, 3
53
+ put_ball_value board.number_of_balls(x, y, Lang::Negro.new), 'N', x, y, 2, 1
54
+ put_ball_value board.number_of_balls(x, y, Lang::Azul.new), 'A', x, y, 6, 1
55
+ put_ball_value board.number_of_balls(x, y, Lang::Verde.new), 'V', x, y, 2, 3
56
+ put_ball_value board.number_of_balls(x, y, Lang::Rojo.new), 'R', x, y, 6, 3
41
57
  end
42
58
  end
43
59
  end
44
60
 
45
61
  def put_ball_value(number, char, x, y, x_offset, y_offset)
46
- unless number.zero?
47
- corner = cell_top_left_corner x, y
48
- pos = corner + (y_offset * line_length) + x_offset
49
- if number < 10
50
- @board[pos] = ' '
51
- @board[pos+1] = number.to_s
52
- else
53
- @board[pos] = number.to_s[0]
54
- @board[pos+1] = number.to_s[1]
55
- end
56
- @board[pos+2] = char
62
+ return if number.zero?
63
+
64
+ corner = cell_top_left_corner(x, y)
65
+ pos = corner + (y_offset * line_length) + x_offset
66
+ if number < 10
67
+ @board[pos] = ' '
68
+ @board[pos + 1] = number.to_s
69
+ else
70
+ @board[pos] = number.to_s[0]
71
+ @board[pos + 1] = number.to_s[1]
57
72
  end
73
+ @board[pos + 2] = char
58
74
  end
59
75
 
60
76
  def highlight_row(x, y, char)
61
- corner = cell_top_left_corner x, y
77
+ corner = cell_top_left_corner(x, y)
62
78
  (cell_width - 1).times do |index|
63
79
  @board[corner + index + 1] = char
64
80
  end
65
81
  end
66
82
 
67
83
  def highlight_column(x, y, char)
68
- corner = cell_top_left_corner x, y
84
+ corner = cell_top_left_corner(x, y)
69
85
  (cell_height - 1).times do |index|
70
86
  @board[corner + ((index + 1) * line_length)] = char
71
87
  end
@@ -98,9 +114,6 @@ module Gobstones
98
114
  def total_rows
99
115
  9
100
116
  end
101
-
102
117
  end
103
-
104
118
  end
105
-
106
119
  end
@@ -5,11 +5,8 @@ require 'gobstones/cli/printer'
5
5
  include Gobstones::Parser
6
6
 
7
7
  module Gobstones
8
-
9
8
  module CLI
10
-
11
9
  class Runner
12
-
13
10
  def self.run(file_name)
14
11
  new(File.read(file_name)).run
15
12
  end
@@ -21,19 +18,32 @@ module Gobstones
21
18
 
22
19
  def run
23
20
  print_program_result parse_program.evaluate
24
- rescue Gobstones::Parser::ParseError => parse_error
25
- handle_parse_error parse_error
26
- rescue Gobstones::Runner::GobstonesTypeError => type_error
27
- handle_type_error type_error
28
- rescue Exception => e
29
- # TODO handle more gobstones exceptions
21
+ rescue Gobstones::Parser::ParseError => e
22
+ handle_parse_error e
23
+ rescue Gobstones::Runner::GobstonesTypeError => e
24
+ handle_type_error e
25
+ rescue Gobstones::Runner::BoomError => e
26
+ handle_boom_error e
27
+ rescue Gobstones::Runner::UndefinedVariableError => e
28
+ handle_undefined_variable_error e
29
+ rescue Gobstones::Runner::EmptyCellError => e
30
+ handle_empty_cell_error e
31
+ rescue Gobstones::Runner::OutOfBoardError => e
32
+ handle_out_of_board_error e
33
+ rescue Gobstones::Runner::DefinitionNotFound => e
34
+ handle_definition_not_found_error e
35
+ rescue Gobstones::Runner::WrongArgumentsError => e
36
+ handle_wrong_arguments_error e
37
+ rescue Gobstones::Runner::GobstonesRuntimeError => e
38
+ handle_runtime_error e
39
+ rescue StandardError => e
30
40
  raise e
31
41
  end
32
42
 
33
43
  private
34
44
 
35
- def print_program_result(context)
36
- Printer.new(context).print
45
+ def print_program_result(result)
46
+ Printer.new(result).print
37
47
  end
38
48
 
39
49
  def parse_program
@@ -42,17 +52,42 @@ module Gobstones
42
52
 
43
53
  def handle_parse_error(parse_error)
44
54
  parse_error.parser.failure_reason =~ /^(Expected .+) after/m
45
- puts "#{$1.gsub("\n", '$NEWLINE')}:"
55
+ puts "#{Regexp.last_match(1).gsub("\n", '$NEWLINE')}:"
46
56
  puts parse_error.code.lines.to_a[parse_error.parser.failure_line - 1]
47
57
  puts "#{'~' * (parse_error.parser.failure_column - 1)}^"
48
58
  end
49
59
 
50
60
  def handle_type_error(type_error)
51
- puts "Type Error: #{type_error.message} occurred in #{type_error.statement}"
61
+ puts "Type Error: #{type_error.message}"
52
62
  end
53
63
 
54
- end
64
+ def handle_boom_error(boom_error)
65
+ puts "BOOM!! #{boom_error.message}"
66
+ end
55
67
 
56
- end
68
+ def handle_undefined_variable_error(undefined_variable_error)
69
+ puts undefined_variable_error.message
70
+ end
71
+
72
+ def handle_empty_cell_error(_empty_cell_error)
73
+ puts 'There are no balls to take out!'
74
+ end
57
75
 
76
+ def handle_out_of_board_error(_out_of_board_error)
77
+ puts 'You fell from the board!'
78
+ end
79
+
80
+ def handle_definition_not_found_error(definition_not_found_error)
81
+ puts definition_not_found_error.message
82
+ end
83
+
84
+ def handle_wrong_arguments_error(wrong_arguments_error)
85
+ puts wrong_arguments_error.message
86
+ end
87
+
88
+ def handle_runtime_error(runtime_error)
89
+ puts runtime_error.message
90
+ end
91
+ end
92
+ end
58
93
  end
@@ -1,3 +1,3 @@
1
1
  require 'gobstones/extensions/boolean'
2
- require 'gobstones/extensions/fixnum'
2
+ require 'gobstones/extensions/integer'
3
3
  require 'gobstones/extensions/string'
@@ -1,17 +1,13 @@
1
- require 'gobstones/lang/literals/booleans'
1
+ require 'gobstones/lang/literals/boolean'
2
2
 
3
3
  class TrueClass
4
-
5
4
  def to_gbs_bool
6
5
  Gobstones::Lang::True.new
7
6
  end
8
-
9
7
  end
10
8
 
11
9
  class FalseClass
12
-
13
10
  def to_gbs_bool
14
11
  Gobstones::Lang::False.new
15
12
  end
16
-
17
13
  end
@@ -1,9 +1,7 @@
1
1
  require 'gobstones/lang/literals/number'
2
2
 
3
- class Fixnum
4
-
3
+ class Integer
5
4
  def to_gbs_num
6
- Gobstones::Lang::Number.new self
5
+ Gobstones::Lang::Number.new(self)
7
6
  end
8
-
9
7
  end
@@ -1,9 +1,7 @@
1
1
  require 'gobstones/lang/expressions/var_name'
2
2
 
3
3
  class String
4
-
5
4
  def to_var_name
6
- Gobstones::Lang::VarName.new self
5
+ Gobstones::Lang::VarName.new(self)
7
6
  end
8
-
9
7
  end
@@ -1,5 +1,5 @@
1
- require 'gobstones/lang/literals/all'
2
- require 'gobstones/lang/expressions/all'
1
+ require 'gobstones/lang/program'
3
2
  require 'gobstones/lang/commands/all'
4
3
  require 'gobstones/lang/definitions/all'
5
- require 'gobstones/lang/program'
4
+ require 'gobstones/lang/expressions/all'
5
+ require 'gobstones/lang/literals/all'
@@ -1,14 +1,15 @@
1
- require 'gobstones/lang/commands/boom_cmd'
1
+ require 'gobstones/lang/commands/boom'
2
2
  require 'gobstones/lang/commands/command_block'
3
- require 'gobstones/lang/commands/if_cmd'
4
- require 'gobstones/lang/commands/ir_al_origen_cmd'
5
- require 'gobstones/lang/commands/mover_cmd'
3
+ require 'gobstones/lang/commands/if'
4
+ require 'gobstones/lang/commands/if_then_else'
5
+ require 'gobstones/lang/commands/ir_al_origen'
6
+ require 'gobstones/lang/commands/mover'
6
7
  require 'gobstones/lang/commands/multiple_assignment'
7
- require 'gobstones/lang/commands/poner_cmd'
8
+ require 'gobstones/lang/commands/poner'
8
9
  require 'gobstones/lang/commands/procedure_call'
9
- require 'gobstones/lang/commands/repeat_with_cmd'
10
- require 'gobstones/lang/commands/sacar_cmd'
10
+ require 'gobstones/lang/commands/repeat_with'
11
+ require 'gobstones/lang/commands/sacar'
11
12
  require 'gobstones/lang/commands/single_assignment'
12
- require 'gobstones/lang/commands/skip_cmd'
13
- require 'gobstones/lang/commands/vaciar_tablero_cmd'
14
- require 'gobstones/lang/commands/while_cmd'
13
+ require 'gobstones/lang/commands/skip'
14
+ require 'gobstones/lang/commands/vaciar_tablero'
15
+ require 'gobstones/lang/commands/while'
@@ -0,0 +1,26 @@
1
+ require 'gobstones/runner/errors/boom_error'
2
+ require 'gobstones/modules/equality_definition'
3
+
4
+ module Gobstones
5
+ module Lang
6
+ module Commands
7
+ class Boom
8
+ include EqualityDefinition
9
+
10
+ attr_reader :message
11
+
12
+ def initialize(message)
13
+ @message = message
14
+ end
15
+
16
+ def equality_attributes
17
+ %i[message]
18
+ end
19
+
20
+ def evaluate(_context)
21
+ raise Runner::BoomError, message
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -1,37 +1,37 @@
1
- require 'gobstones/modules/equal_by_class'
1
+ require 'gobstones/modules/equality_definition'
2
2
 
3
3
  module Gobstones
4
-
5
4
  module Lang
5
+ module Commands
6
+ class CommandBlock
7
+ include EqualityDefinition
6
8
 
7
- class CommandBlock
9
+ attr_reader :commands
8
10
 
9
- include Gobstones::EqualByClass
11
+ def self.empty
12
+ new([])
13
+ end
10
14
 
11
- attr_reader :commands
15
+ def self.with_just(a_command)
16
+ new([a_command])
17
+ end
12
18
 
13
- def self.empty
14
- self.new []
15
- end
19
+ def initialize(commands)
20
+ @commands = commands
21
+ end
16
22
 
17
- def initialize(commands)
18
- @commands = commands
19
- end
23
+ def equality_attributes
24
+ %i[commands]
25
+ end
20
26
 
21
- def ==(other)
22
- super(other) && self.commands == other.commands
23
- end
27
+ def empty?
28
+ commands.empty?
29
+ end
24
30
 
25
- def empty?
26
- commands.empty?
31
+ def evaluate(context)
32
+ commands.each { |command| command.evaluate(context) }
33
+ end
27
34
  end
28
-
29
- def evaluate(context)
30
- commands.each { |command| command.evaluate context }
31
- end
32
-
33
35
  end
34
-
35
36
  end
36
-
37
37
  end
@@ -0,0 +1,26 @@
1
+ require 'gobstones/modules/equality_definition'
2
+
3
+ module Gobstones
4
+ module Lang
5
+ module Commands
6
+ class Conditional
7
+ include EqualityDefinition
8
+
9
+ attr_reader :condition, :then_block
10
+
11
+ def initialize(condition, then_block)
12
+ @condition = condition
13
+ @then_block = then_block
14
+ end
15
+
16
+ def equality_attributes
17
+ %i[condition then_block]
18
+ end
19
+
20
+ def evaluate_condition(context)
21
+ condition.evaluate(context)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,13 @@
1
+ require 'gobstones/lang/commands/conditional'
2
+
3
+ module Gobstones
4
+ module Lang
5
+ module Commands
6
+ class If < Conditional
7
+ def evaluate(context)
8
+ evaluate_condition(context).if_true(then_block, context)
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,26 @@
1
+ require 'gobstones/lang/commands/if'
2
+
3
+ module Gobstones
4
+ module Lang
5
+ module Commands
6
+ class IfThenElse < If
7
+ attr_reader :else_block
8
+
9
+ def initialize(condition, then_block, else_block)
10
+ super(condition, then_block)
11
+ @else_block = else_block
12
+ end
13
+
14
+ def equality_attributes
15
+ super + [:else_block]
16
+ end
17
+
18
+ def evaluate(context)
19
+ evaluate_condition(context).
20
+ if_true(then_block, context).
21
+ if_false(else_block, context)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end