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.
- checksums.yaml +5 -5
- data/.rubocop.yml +133 -0
- data/.rubocop_todo.yml +75 -0
- data/.simplecov +1 -3
- data/.tool-versions +1 -0
- data/.travis.yml +9 -2
- data/Gemfile +11 -5
- data/Gemfile.lock +65 -39
- data/README.md +8 -1
- data/Rakefile +1 -1
- data/bin/gobstones +1 -1
- data/gobstones.gemspec +12 -11
- data/lib/gobstones/cli/printer.rb +41 -28
- data/lib/gobstones/cli/runner.rb +50 -15
- data/lib/gobstones/extensions/all.rb +1 -1
- data/lib/gobstones/extensions/boolean.rb +1 -5
- data/lib/gobstones/extensions/{fixnum.rb → integer.rb} +2 -4
- data/lib/gobstones/extensions/string.rb +1 -3
- data/lib/gobstones/lang/all.rb +3 -3
- data/lib/gobstones/lang/commands/all.rb +11 -10
- data/lib/gobstones/lang/commands/boom.rb +26 -0
- data/lib/gobstones/lang/commands/command_block.rb +23 -23
- data/lib/gobstones/lang/commands/conditional.rb +26 -0
- data/lib/gobstones/lang/commands/if.rb +13 -0
- data/lib/gobstones/lang/commands/if_then_else.rb +26 -0
- data/lib/gobstones/lang/commands/ir_al_origen.rb +15 -0
- data/lib/gobstones/lang/commands/mover.rb +23 -0
- data/lib/gobstones/lang/commands/multiple_assignment.rb +34 -21
- data/lib/gobstones/lang/commands/poner.rb +31 -0
- data/lib/gobstones/lang/commands/procedure_call.rb +8 -8
- data/lib/gobstones/lang/commands/repeat_with.rb +69 -0
- data/lib/gobstones/lang/commands/sacar.rb +29 -0
- data/lib/gobstones/lang/commands/single_assignment.rb +15 -20
- data/lib/gobstones/lang/commands/skip.rb +15 -0
- data/lib/gobstones/lang/commands/vaciar_tablero.rb +15 -0
- data/lib/gobstones/lang/commands/while.rb +20 -0
- data/lib/gobstones/lang/definitions/definition.rb +16 -23
- data/lib/gobstones/lang/definitions/definition_call.rb +7 -15
- data/lib/gobstones/lang/definitions/function.rb +1 -7
- data/lib/gobstones/lang/definitions/main.rb +1 -8
- data/lib/gobstones/lang/definitions/no_return_statement.rb +2 -8
- data/lib/gobstones/lang/definitions/procedure.rb +1 -7
- data/lib/gobstones/lang/definitions/return_from_function.rb +6 -13
- data/lib/gobstones/lang/definitions/return_from_main.rb +15 -10
- data/lib/gobstones/lang/definitions/var_tuple.rb +10 -12
- data/lib/gobstones/lang/expressions/arithmetic_expressions.rb +17 -27
- data/lib/gobstones/lang/expressions/boolean_expressions.rb +4 -10
- data/lib/gobstones/lang/expressions/comparison_expressions.rb +0 -16
- data/lib/gobstones/lang/expressions/enclosed_by_parens_expression.rb +3 -5
- data/lib/gobstones/lang/expressions/expression.rb +18 -0
- data/lib/gobstones/lang/expressions/function_call.rb +9 -6
- data/lib/gobstones/lang/expressions/one_arg_expression.rb +8 -16
- data/lib/gobstones/lang/expressions/primitive_functions.rb +24 -16
- data/lib/gobstones/lang/expressions/two_arg_expression.rb +9 -16
- data/lib/gobstones/lang/expressions/type_bound_functions.rb +30 -25
- data/lib/gobstones/lang/expressions/var_name.rb +9 -13
- data/lib/gobstones/lang/literals/all.rb +3 -3
- data/lib/gobstones/lang/literals/{booleans.rb → boolean.rb} +24 -22
- data/lib/gobstones/lang/literals/{colors.rb → color.rb} +4 -14
- data/lib/gobstones/lang/literals/{directions.rb → direction.rb} +3 -13
- data/lib/gobstones/lang/literals/literal.rb +35 -27
- data/lib/gobstones/lang/literals/number.rb +6 -8
- data/lib/gobstones/lang/program.rb +9 -16
- data/lib/gobstones/modules/equality_definition.rb +23 -0
- data/lib/gobstones/parser/ast/ast.rb +48 -70
- data/lib/gobstones/parser/parse_error.rb +2 -7
- data/lib/gobstones/parser/treetop_parser.rb +9 -14
- data/lib/gobstones/runner/board.rb +12 -15
- data/lib/gobstones/runner/cell.rb +14 -20
- data/lib/gobstones/runner/errors/all.rb +1 -1
- data/lib/gobstones/runner/errors/boom_error.rb +0 -5
- data/lib/gobstones/runner/errors/definition_not_found_error.rb +7 -7
- data/lib/gobstones/runner/errors/empty_cell_error.rb +0 -5
- data/lib/gobstones/runner/errors/gobstones_runtime_error.rb +0 -5
- data/lib/gobstones/runner/errors/gobstones_type_error.rb +2 -7
- data/lib/gobstones/runner/errors/out_of_board_error.rb +0 -5
- data/lib/gobstones/runner/errors/undefined_variable_error.rb +6 -4
- data/lib/gobstones/runner/errors/wrong_arguments_error.rb +0 -5
- data/lib/gobstones/runner/execution_context.rb +16 -33
- data/lib/gobstones/runner/head.rb +17 -20
- data/lib/gobstones/runner/program_result.rb +12 -0
- data/lib/gobstones/type_check_result.rb +0 -4
- data/spec/lang/commands/boom_spec.rb +7 -0
- data/spec/lang/commands/command_block_spec.rb +15 -0
- data/spec/lang/commands/if_spec.rb +32 -0
- data/spec/lang/commands/if_then_else_spec.rb +19 -0
- data/spec/lang/commands/ir_al_origen_spec.rb +11 -0
- data/spec/lang/commands/mover_spec.rb +30 -0
- data/spec/lang/commands/multiple_assignment_spec.rb +39 -22
- data/spec/lang/commands/poner_spec.rb +27 -0
- data/spec/lang/commands/procedure_call_spec.rb +26 -28
- data/spec/lang/commands/procedure_spec.rb +32 -32
- data/spec/lang/commands/repeat_with_spec.rb +64 -0
- data/spec/lang/commands/sacar_spec.rb +32 -0
- data/spec/lang/commands/single_assignment_spec.rb +5 -6
- data/spec/lang/commands/skip_spec.rb +10 -0
- data/spec/lang/commands/vaciar_tablero_spec.rb +10 -0
- data/spec/lang/commands/while_spec.rb +39 -0
- data/spec/lang/definitions/main_spec.rb +34 -0
- data/spec/lang/definitions/no_return_statement_spec.rb +4 -5
- data/spec/lang/definitions/var_tuple_spec.rb +4 -7
- data/spec/lang/expressions/arithmetic_expressions_spec.rb +37 -64
- data/spec/lang/expressions/boolean_expressions_spec.rb +25 -34
- data/spec/lang/expressions/comparison_expressions_spec.rb +109 -155
- data/spec/lang/expressions/enclosed_by_parens_expression_spec.rb +3 -7
- data/spec/lang/expressions/function_call_spec.rb +24 -20
- data/spec/lang/expressions/primitive_functions_spec.rb +28 -39
- data/spec/lang/expressions/type_bound_functions_spec.rb +10 -18
- data/spec/lang/expressions/var_name_spec.rb +8 -12
- data/spec/lang/literals/{booleans_spec.rb → boolean_spec.rb} +3 -5
- data/spec/lang/literals/color_spec.rb +19 -0
- data/spec/lang/literals/direction_spec.rb +46 -0
- data/spec/lang/literals/{numbers_spec.rb → number_spec.rb} +3 -4
- data/spec/matchers/parse_matcher.rb +9 -11
- data/spec/parser/arithmetic_expressions_spec.rb +51 -61
- data/spec/parser/assignments_spec.rb +21 -31
- data/spec/parser/boolean_expressions_spec.rb +35 -43
- data/spec/parser/command_block_spec.rb +18 -20
- data/spec/parser/data_types_spec.rb +9 -19
- data/spec/parser/function_calls_spec.rb +19 -19
- data/spec/parser/function_definitions_spec.rb +17 -22
- data/spec/parser/gobstones_program_spec.rb +30 -30
- data/spec/parser/if_command_spec.rb +19 -28
- data/spec/parser/main_definition_spec.rb +13 -16
- data/spec/parser/nested_expressions_spec.rb +20 -24
- data/spec/parser/primitive_expressions_spec.rb +33 -38
- data/spec/parser/procedure_calls_spec.rb +17 -18
- data/spec/parser/procedure_definitions_spec.rb +12 -15
- data/spec/parser/repeat_with_command_spec.rb +10 -10
- data/spec/parser/simple_commands_spec.rb +23 -37
- data/spec/parser/treetop_parser_spec.rb +87 -83
- data/spec/parser/var_tuple_spec.rb +8 -12
- data/spec/parser/while_command_spec.rb +11 -14
- data/spec/runner/board_spec.rb +28 -33
- data/spec/runner/cell_spec.rb +21 -28
- data/spec/runner/execution_context_spec.rb +18 -35
- data/spec/runner/head_spec.rb +54 -60
- data/spec/spec_helper.rb +10 -1
- data/spec/support/board_assertions.rb +18 -0
- data/spec/{gobstones_lang_test_objects.rb → support/gobstones_lang_test_objects.rb} +6 -4
- data/spec/type_checker_spec.rb +19 -25
- metadata +80 -56
- data/.ruby-version +0 -1
- data/lib/gobstones/lang/commands/boom_cmd.rb +0 -31
- data/lib/gobstones/lang/commands/conditional_cmd.rb +0 -31
- data/lib/gobstones/lang/commands/if_cmd.rb +0 -38
- data/lib/gobstones/lang/commands/ir_al_origen_cmd.rb +0 -19
- data/lib/gobstones/lang/commands/mover_cmd.rb +0 -27
- data/lib/gobstones/lang/commands/poner_cmd.rb +0 -35
- data/lib/gobstones/lang/commands/repeat_with_cmd.rb +0 -77
- data/lib/gobstones/lang/commands/sacar_cmd.rb +0 -33
- data/lib/gobstones/lang/commands/skip_cmd.rb +0 -19
- data/lib/gobstones/lang/commands/vaciar_tablero_cmd.rb +0 -19
- data/lib/gobstones/lang/commands/while_cmd.rb +0 -25
- data/lib/gobstones/modules/equal_by_class.rb +0 -13
- data/spec/lang/commands/boom_cmd_spec.rb +0 -8
- data/spec/lang/commands/cmd_block_spec.rb +0 -21
- data/spec/lang/commands/if_cmd_spec.rb +0 -50
- data/spec/lang/commands/ir_al_origen_cmd_spec.rb +0 -16
- data/spec/lang/commands/mover_cmd_spec.rb +0 -36
- data/spec/lang/commands/poner_cmd_spec.rb +0 -28
- data/spec/lang/commands/repeat_with_cmd_spec.rb +0 -60
- data/spec/lang/commands/sacar_cmd_spec.rb +0 -35
- data/spec/lang/commands/skip_cmd_spec.rb +0 -12
- data/spec/lang/commands/vaciar_tablero_cmd_spec.rb +0 -14
- data/spec/lang/commands/while_cmd_spec.rb +0 -43
- data/spec/lang/literals/colors_spec.rb +0 -13
- data/spec/lang/literals/directions_spec.rb +0 -45
@@ -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/
|
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
|
-
|
9
|
+
attr_reader :var_tuple, :expression
|
8
10
|
|
9
|
-
|
11
|
+
def initialize(var_tuple, expression)
|
12
|
+
@var_tuple = var_tuple
|
13
|
+
@expression = expression
|
14
|
+
end
|
10
15
|
|
11
|
-
|
16
|
+
def equality_attributes
|
17
|
+
%i[var_tuple expression]
|
18
|
+
end
|
12
19
|
|
13
|
-
|
14
|
-
|
15
|
-
|
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
|
-
|
18
|
-
super(other) &&
|
19
|
-
self.var_tuple == other.var_tuple &&
|
20
|
-
self.expression == other.expression
|
21
|
-
end
|
30
|
+
private
|
22
31
|
|
23
|
-
|
24
|
-
|
25
|
-
|
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
|
-
|
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
|
-
|
8
|
-
|
9
|
-
|
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/
|
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
|
-
|
8
|
-
|
9
|
-
include Gobstones::EqualByClass
|
9
|
+
attr_reader :var_name, :expression
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
end
|
11
|
+
def initialize(var_name, expression)
|
12
|
+
@var_name = var_name
|
13
|
+
@expression = expression
|
14
|
+
end
|
16
15
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
self.expression == other.expression
|
21
|
-
end
|
16
|
+
def equality_attributes
|
17
|
+
%i[var_name expression]
|
18
|
+
end
|
22
19
|
|
23
|
-
|
24
|
-
|
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,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/
|
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
|
21
|
-
|
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
|
32
|
+
return return_statement.evaluate(definition_context)
|
38
33
|
end
|
39
34
|
end
|
40
35
|
|
41
|
-
def create_context_based_on(
|
42
|
-
|
36
|
+
def create_context_based_on(_outer_context)
|
37
|
+
subclass_responsibility
|
43
38
|
end
|
44
39
|
|
45
40
|
def definition_type
|
46
|
-
|
41
|
+
subclass_responsibility
|
47
42
|
end
|
48
43
|
|
49
44
|
private
|
50
45
|
|
51
46
|
def check_number_of_arguments(calling_arguments)
|
52
|
-
raise
|
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
|
-
|
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
|
62
|
-
yield
|
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
|