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
@@ -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