gobstones 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
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