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
@@ -0,0 +1,15 @@
1
+ require 'gobstones/modules/equality_definition'
2
+
3
+ module Gobstones
4
+ module Lang
5
+ module Commands
6
+ class IrAlOrigen
7
+ include EqualityDefinition
8
+
9
+ def evaluate(context)
10
+ context.head.go_to_origin
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,23 @@
1
+ require 'gobstones/lang/expressions/one_arg_expression'
2
+
3
+ module Gobstones
4
+ module Lang
5
+ module Commands
6
+ class Mover < OneArgExpression
7
+ def evaluate(context)
8
+ with_evaluated_argument_in(context) do |result|
9
+ context.head.move result
10
+ end
11
+ end
12
+
13
+ def undo(context)
14
+ opposite.evaluate context
15
+ end
16
+
17
+ def opposite
18
+ Mover.new(argument.opposite)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,35 +1,48 @@
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 MultipleAssignment
7
+ include EqualityDefinition
6
8
 
7
- class MultipleAssignment
9
+ attr_reader :var_tuple, :expression
8
10
 
9
- include Gobstones::EqualByClass
11
+ def initialize(var_tuple, expression)
12
+ @var_tuple = var_tuple
13
+ @expression = expression
14
+ end
10
15
 
11
- attr_reader :var_tuple, :expression
16
+ def equality_attributes
17
+ %i[var_tuple expression]
18
+ end
12
19
 
13
- def initialize(var_tuple, expression)
14
- @var_tuple, @expression = var_tuple, expression
15
- end
20
+ def evaluate(context)
21
+ # TODO implement as many simple assignments?
22
+ validate_expression_is_function_call
23
+ function_call_result = expression.evaluate(context)
24
+ check_number_of_arguments(function_call_result)
25
+ function_call_result.length.times do |index|
26
+ context.set(var_tuple.variable_at(index), function_call_result[index])
27
+ end
28
+ end
16
29
 
17
- def ==(other)
18
- super(other) &&
19
- self.var_tuple == other.var_tuple &&
20
- self.expression == other.expression
21
- end
30
+ private
22
31
 
23
- def evaluate(context)
24
- # TODO implement as many simple assignments?
25
- function_call_result = expression.evaluate(context)
26
- function_call_result.length.times do |index|
27
- context.set var_tuple.variable_at(index), function_call_result[index]
32
+ def validate_expression_is_function_call
33
+ raise Runner::GobstonesTypeError, 'expected a function call in multiple assignment' unless
34
+ expression.is_function_call?
28
35
  end
29
- end
30
36
 
31
- end
37
+ def check_number_of_arguments(calling_arguments)
38
+ raise Runner::WrongArgumentsError, wrong_number_of_arguments_message(calling_arguments) if
39
+ var_tuple.length != calling_arguments.length
40
+ end
32
41
 
42
+ def wrong_number_of_arguments_message(calling_arguments)
43
+ "Wrong number of arguments in assignment: expected #{var_tuple.length}, got #{calling_arguments.length}"
44
+ end
45
+ end
46
+ end
33
47
  end
34
-
35
48
  end
@@ -0,0 +1,31 @@
1
+ require 'gobstones/lang/expressions/one_arg_expression'
2
+ require 'gobstones/lang/commands/sacar'
3
+ require 'gobstones/runner/errors/gobstones_type_error'
4
+
5
+ module Gobstones
6
+ module Lang
7
+ module Commands
8
+ class Poner < OneArgExpression
9
+ def evaluate(context)
10
+ with_evaluated_argument_in(context) do |result|
11
+ context.head.put result
12
+ end
13
+ rescue RuntimeError => e
14
+ raise Runner::GobstonesTypeError, e.message
15
+ end
16
+
17
+ def undo(context)
18
+ # TODO maybe the command should use the original context
19
+ # instead of this one (when it was executed)
20
+ with_evaluated_argument_in(context) do |result|
21
+ context.head.take_out result
22
+ end
23
+ end
24
+
25
+ def opposite
26
+ Sacar.new(argument)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -1,15 +1,15 @@
1
1
  require 'gobstones/lang/definitions/definition_call'
2
2
 
3
3
  module Gobstones
4
-
5
4
  module Lang
6
-
7
- class ProcedureCall
8
-
9
- include DefinitionCall
10
-
5
+ module Commands
6
+ class ProcedureCall
7
+ include Lang::DefinitionCall
8
+
9
+ def to_s
10
+ "procedure call to #{name}"
11
+ end
12
+ end
11
13
  end
12
-
13
14
  end
14
-
15
15
  end
@@ -0,0 +1,69 @@
1
+ require 'gobstones/lang/commands/single_assignment'
2
+ require 'gobstones/lang/commands/command_block'
3
+ require 'gobstones/lang/commands/while'
4
+ require 'gobstones/lang/expressions/comparison_expressions'
5
+ require 'gobstones/lang/expressions/primitive_functions'
6
+ require 'gobstones/runner/errors/gobstones_runtime_error'
7
+ require 'gobstones/runner/errors/gobstones_type_error'
8
+ require 'gobstones/modules/equality_definition'
9
+
10
+ module Gobstones
11
+ module Lang
12
+ module Commands
13
+ class RepeatWith
14
+ include EqualityDefinition
15
+
16
+ attr_reader :var_name, :range_min, :range_max, :cmd_block
17
+
18
+ def initialize(var_name, range_min, range_max, cmd_block)
19
+ @var_name = var_name
20
+ @range_min = range_min
21
+ @range_max = range_max
22
+ @cmd_block = cmd_block
23
+ end
24
+
25
+ def equality_attributes
26
+ %i[var_name range_min range_max cmd_block]
27
+ end
28
+
29
+ def evaluate(context)
30
+ validate_range_values context
31
+ validate_index_variable_not_defined context
32
+ while_based_equivalent_cmd.evaluate context
33
+ clear_index_variable_from context
34
+ end
35
+
36
+ private
37
+
38
+ def clear_index_variable_from(context)
39
+ context.clear var_name
40
+ end
41
+
42
+ def validate_range_values(context)
43
+ raise Runner::GobstonesTypeError, "types don't match in range values" \
44
+ unless range_min.evaluate(context).same_type_as(range_max.evaluate(context))
45
+ end
46
+
47
+ def validate_index_variable_not_defined(context)
48
+ raise Runner::GobstonesRuntimeError, "index variable can't be used because it's already defined" \
49
+ if context.has_variable_named?(var_name.name)
50
+ end
51
+
52
+ def while_based_equivalent_cmd
53
+ #
54
+ # repeatWith var in min..max block
55
+ # is equivalent to
56
+ # if (min <= max) { var := min; while (var < max) { block; var := siguiente(var) }; block }
57
+ #
58
+ assign_cmd = SingleAssignment.new(var_name, range_min)
59
+ while_cond = LessThan.new(var_name, range_max)
60
+ increment = SingleAssignment.new(var_name, Siguiente.new(var_name))
61
+ while_block = CommandBlock.new([cmd_block, increment])
62
+ while_cmd = While.new(while_cond, while_block)
63
+ if_cond = LessEqual.new(range_min, range_max)
64
+ If.new(if_cond, CommandBlock.new([assign_cmd, while_cmd, cmd_block]))
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,29 @@
1
+ require 'gobstones/lang/expressions/one_arg_expression'
2
+ require 'gobstones/lang/commands/poner'
3
+ require 'gobstones/runner/errors/gobstones_type_error'
4
+
5
+ module Gobstones
6
+ module Lang
7
+ module Commands
8
+ class Sacar < OneArgExpression
9
+ def evaluate(context)
10
+ with_evaluated_argument_in(context) do |result|
11
+ context.head.take_out result
12
+ end
13
+ rescue RuntimeError => e
14
+ raise Runner::GobstonesTypeError, e.message
15
+ end
16
+
17
+ def undo(context)
18
+ with_evaluated_argument_in(context) do |result|
19
+ context.head.put result
20
+ end
21
+ end
22
+
23
+ def opposite
24
+ Poner.new(argument)
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -1,31 +1,26 @@
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 SingleAssignment
7
+ include EqualityDefinition
6
8
 
7
- class SingleAssignment
8
-
9
- include Gobstones::EqualByClass
9
+ attr_reader :var_name, :expression
10
10
 
11
- attr_reader :var_name, :expression
12
-
13
- def initialize(var_name, expression)
14
- @var_name, @expression = var_name, expression
15
- end
11
+ def initialize(var_name, expression)
12
+ @var_name = var_name
13
+ @expression = expression
14
+ end
16
15
 
17
- def ==(other)
18
- super(other) &&
19
- self.var_name == other.var_name &&
20
- self.expression == other.expression
21
- end
16
+ def equality_attributes
17
+ %i[var_name expression]
18
+ end
22
19
 
23
- def evaluate(context)
24
- context.set var_name, expression.evaluate(context)
20
+ def evaluate(context)
21
+ context.set(var_name, expression.evaluate(context))
22
+ end
25
23
  end
26
-
27
24
  end
28
-
29
25
  end
30
-
31
26
  end
@@ -0,0 +1,15 @@
1
+ require 'gobstones/modules/equality_definition'
2
+
3
+ module Gobstones
4
+ module Lang
5
+ module Commands
6
+ class Skip
7
+ include EqualityDefinition
8
+
9
+ def evaluate(_context)
10
+ # do nothing, that's my job :-)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ require 'gobstones/modules/equality_definition'
2
+
3
+ module Gobstones
4
+ module Lang
5
+ module Commands
6
+ class VaciarTablero
7
+ include EqualityDefinition
8
+
9
+ def evaluate(context)
10
+ context.board.empty!
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,20 @@
1
+ require 'gobstones/lang/commands/conditional'
2
+ require 'gobstones/runner/errors/gobstones_runtime_error'
3
+
4
+ module Gobstones
5
+ module Lang
6
+ module Commands
7
+ class While < Conditional
8
+ STACK_LIMIT = 10_000
9
+
10
+ def evaluate(context, stack_size = 0)
11
+ raise Runner::GobstonesRuntimeError, 'stack overflow' if stack_size == STACK_LIMIT
12
+ return unless evaluate_condition(context).true?
13
+
14
+ then_block.evaluate(context)
15
+ evaluate(context, stack_size + 1)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -1,12 +1,11 @@
1
- require 'gobstones/modules/equal_by_class'
1
+ require 'gobstones/modules/equality_definition'
2
+ require 'gobstones/runner/errors/wrong_arguments_error'
3
+ require 'error_handling_protocol'
2
4
 
3
5
  module Gobstones
4
-
5
6
  module Lang
6
-
7
7
  class Definition
8
-
9
- include Gobstones::EqualByClass
8
+ include EqualityDefinition
10
9
 
11
10
  attr_reader :name, :arguments, :body, :return_statement
12
11
 
@@ -17,49 +16,45 @@ module Gobstones
17
16
  @return_statement = return_statement
18
17
  end
19
18
 
20
- def ==(other)
21
- super(other) &&
22
- self.name == other.name &&
23
- self.arguments == other.arguments &&
24
- self.body == other.body &&
25
- self.return_statement == other.return_statement
19
+ def equality_attributes
20
+ %i[name arguments body return_statement]
26
21
  end
27
22
 
28
23
  def named?(a_name)
29
24
  name == a_name
30
25
  end
31
26
 
32
- def evaluate(context, calling_arguments=[])
27
+ def evaluate(context, calling_arguments = [])
33
28
  check_number_of_arguments calling_arguments
34
29
  in_definition_context_based_on(context) do |definition_context|
35
30
  set_arguments calling_arguments, definition_context
36
31
  body.evaluate definition_context
37
- return return_statement.evaluate definition_context
32
+ return return_statement.evaluate(definition_context)
38
33
  end
39
34
  end
40
35
 
41
- def create_context_based_on(outer_context)
42
- raise 'subclass responsibility'
36
+ def create_context_based_on(_outer_context)
37
+ subclass_responsibility
43
38
  end
44
39
 
45
40
  def definition_type
46
- raise 'subclass responsibility'
41
+ subclass_responsibility
47
42
  end
48
43
 
49
44
  private
50
45
 
51
46
  def check_number_of_arguments(calling_arguments)
52
- raise Gobstones::Runner::WrongArgumentsError, wrong_number_of_arguments_message(calling_arguments) if
47
+ raise Runner::WrongArgumentsError, wrong_number_of_arguments_message(calling_arguments) if
53
48
  arguments.length != calling_arguments.length
54
49
  end
55
50
 
56
51
  def wrong_number_of_arguments_message(calling_arguments)
57
- "Wrong number of arguments in #{definition_type} '#{name}':" +
58
- " expected #{arguments.length}, got #{calling_arguments.length}"
52
+ "Wrong number of arguments in #{definition_type} '#{name}':" \
53
+ " expected #{arguments.length}, got #{calling_arguments.length}"
59
54
  end
60
55
 
61
- def in_definition_context_based_on(outer_context, &block)
62
- yield create_context_based_on(outer_context)
56
+ def in_definition_context_based_on(outer_context)
57
+ yield(create_context_based_on(outer_context))
63
58
  end
64
59
 
65
60
  def set_arguments(calling_arguments, procedure_context)
@@ -68,7 +63,5 @@ module Gobstones
68
63
  end
69
64
  end
70
65
  end
71
-
72
66
  end
73
-
74
67
  end