gobstones 0.0.1.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (128) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -3
  3. data/.ruby-version +1 -1
  4. data/.travis.yml +1 -1
  5. data/CHANGELOG +22 -2
  6. data/Gemfile +3 -3
  7. data/Gemfile.lock +32 -27
  8. data/bin/gobstones +1 -1
  9. data/examples/.gitkeep +0 -0
  10. data/gobstones.gemspec +2 -2
  11. data/lib/gobstones/cli/board_template +1 -1
  12. data/lib/gobstones/cli/printer.rb +1 -1
  13. data/lib/gobstones/cli/runner.rb +8 -2
  14. data/lib/gobstones/extensions/all.rb +2 -1
  15. data/lib/gobstones/extensions/boolean.rb +1 -1
  16. data/lib/gobstones/extensions/fixnum.rb +1 -1
  17. data/lib/gobstones/extensions/string.rb +9 -0
  18. data/lib/gobstones/lang/all.rb +1 -1
  19. data/lib/gobstones/lang/commands/all.rb +3 -2
  20. data/lib/gobstones/lang/commands/boom_cmd.rb +6 -3
  21. data/lib/gobstones/lang/commands/command_block.rb +1 -1
  22. data/lib/gobstones/lang/commands/conditional_cmd.rb +5 -1
  23. data/lib/gobstones/lang/commands/ir_al_origen_cmd.rb +1 -1
  24. data/lib/gobstones/lang/commands/mover_cmd.rb +4 -2
  25. data/lib/gobstones/lang/commands/multiple_assignment.rb +35 -0
  26. data/lib/gobstones/lang/commands/poner_cmd.rb +8 -4
  27. data/lib/gobstones/lang/commands/procedure_call.rb +1 -9
  28. data/lib/gobstones/lang/commands/repeat_with_cmd.rb +10 -6
  29. data/lib/gobstones/lang/commands/sacar_cmd.rb +9 -7
  30. data/lib/gobstones/lang/commands/{assignments.rb → single_assignment.rb} +5 -3
  31. data/lib/gobstones/lang/commands/skip_cmd.rb +2 -2
  32. data/lib/gobstones/lang/commands/vaciar_tablero_cmd.rb +1 -1
  33. data/lib/gobstones/lang/commands/while_cmd.rb +1 -1
  34. data/lib/gobstones/lang/definitions/all.rb +1 -1
  35. data/lib/gobstones/lang/definitions/definition.rb +47 -5
  36. data/lib/gobstones/lang/definitions/definition_call.rb +17 -5
  37. data/lib/gobstones/lang/definitions/function.rb +9 -0
  38. data/lib/gobstones/lang/definitions/main.rb +1 -1
  39. data/lib/gobstones/lang/definitions/no_return_statement.rb +7 -3
  40. data/lib/gobstones/lang/definitions/procedure.rb +5 -20
  41. data/lib/gobstones/lang/definitions/return_from_function.rb +12 -2
  42. data/lib/gobstones/lang/definitions/return_from_main.rb +5 -1
  43. data/lib/gobstones/lang/definitions/var_tuple.rb +13 -1
  44. data/lib/gobstones/lang/expressions/all.rb +1 -1
  45. data/lib/gobstones/lang/expressions/arithmetic_expressions.rb +1 -1
  46. data/lib/gobstones/lang/expressions/boolean_expressions.rb +3 -2
  47. data/lib/gobstones/lang/expressions/enclosed_by_parens_expression.rb +17 -0
  48. data/lib/gobstones/lang/expressions/function_call.rb +1 -1
  49. data/lib/gobstones/lang/expressions/one_arg_expression.rb +16 -4
  50. data/lib/gobstones/lang/expressions/primitive_functions.rb +18 -12
  51. data/lib/gobstones/lang/expressions/two_arg_expression.rb +7 -3
  52. data/lib/gobstones/lang/expressions/type_bound_functions.rb +1 -1
  53. data/lib/gobstones/lang/expressions/var_name.rb +9 -3
  54. data/lib/gobstones/lang/literals/all.rb +1 -1
  55. data/lib/gobstones/lang/literals/colors.rb +1 -1
  56. data/lib/gobstones/lang/literals/literal.rb +31 -21
  57. data/lib/gobstones/lang/literals/number.rb +1 -1
  58. data/lib/gobstones/lang/program.rb +13 -4
  59. data/lib/gobstones/modules/equal_by_class.rb +1 -1
  60. data/lib/gobstones/parser/ast/ast.rb +12 -8
  61. data/lib/gobstones/parser/grammar/gobstones.treetop +4 -4
  62. data/lib/gobstones/parser/parse_error.rb +1 -1
  63. data/lib/gobstones/runner/all.rb +1 -2
  64. data/lib/gobstones/runner/board.rb +13 -4
  65. data/lib/gobstones/runner/cell.rb +10 -0
  66. data/lib/gobstones/runner/errors/all.rb +1 -1
  67. data/lib/gobstones/runner/errors/definition_not_found_error.rb +1 -1
  68. data/lib/gobstones/runner/execution_context.rb +66 -16
  69. data/lib/gobstones/runner/head.rb +17 -3
  70. data/spec/gobstones_lang_test_objects.rb +75 -0
  71. data/spec/lang/commands/boom_cmd_spec.rb +3 -3
  72. data/spec/lang/commands/cmd_block_spec.rb +14 -14
  73. data/spec/lang/commands/if_cmd_spec.rb +21 -20
  74. data/spec/lang/commands/ir_al_origen_cmd_spec.rb +3 -3
  75. data/spec/lang/commands/mover_cmd_spec.rb +12 -14
  76. data/spec/lang/commands/multiple_assignment_spec.rb +37 -0
  77. data/spec/lang/commands/poner_cmd_spec.rb +13 -14
  78. data/spec/lang/commands/procedure_call_spec.rb +19 -24
  79. data/spec/lang/commands/procedure_spec.rb +32 -36
  80. data/spec/lang/commands/repeat_with_cmd_spec.rb +39 -20
  81. data/spec/lang/commands/sacar_cmd_spec.rb +17 -16
  82. data/spec/lang/commands/single_assignment_spec.rb +13 -0
  83. data/spec/lang/commands/skip_cmd_spec.rb +2 -2
  84. data/spec/lang/commands/vaciar_tablero_cmd_spec.rb +7 -6
  85. data/spec/lang/commands/while_cmd_spec.rb +21 -15
  86. data/spec/lang/definitions/no_return_statement_spec.rb +10 -0
  87. data/spec/lang/definitions/var_tuple_spec.rb +16 -0
  88. data/spec/lang/expressions/arithmetic_expressions_spec.rb +15 -15
  89. data/spec/lang/expressions/boolean_expressions_spec.rb +35 -25
  90. data/spec/lang/expressions/comparison_expressions_spec.rb +25 -28
  91. data/spec/lang/expressions/enclosed_by_parens_expression_spec.rb +11 -0
  92. data/spec/lang/expressions/function_call_spec.rb +29 -0
  93. data/spec/lang/expressions/primitive_functions_spec.rb +60 -62
  94. data/spec/lang/expressions/type_bound_functions_spec.rb +13 -13
  95. data/spec/lang/expressions/var_name_spec.rb +20 -8
  96. data/spec/lang/literals/booleans_spec.rb +5 -7
  97. data/spec/lang/literals/colors_spec.rb +4 -4
  98. data/spec/lang/literals/directions_spec.rb +12 -12
  99. data/spec/lang/literals/numbers_spec.rb +2 -2
  100. data/spec/matchers/parse_matcher.rb +9 -10
  101. data/spec/parser/arithmetic_expressions_spec.rb +19 -19
  102. data/spec/parser/assignments_spec.rb +24 -10
  103. data/spec/parser/boolean_expressions_spec.rb +18 -18
  104. data/spec/parser/command_block_spec.rb +17 -19
  105. data/spec/parser/data_types_spec.rb +23 -23
  106. data/spec/parser/function_calls_spec.rb +13 -12
  107. data/spec/parser/function_definitions_spec.rb +13 -18
  108. data/spec/parser/gobstones_program_spec.rb +15 -15
  109. data/spec/parser/if_command_spec.rb +13 -12
  110. data/spec/parser/main_definition_spec.rb +12 -12
  111. data/spec/parser/nested_expressions_spec.rb +16 -20
  112. data/spec/parser/primitive_expressions_spec.rb +27 -33
  113. data/spec/parser/procedure_calls_spec.rb +12 -12
  114. data/spec/parser/procedure_definitions_spec.rb +10 -16
  115. data/spec/parser/repeat_with_command_spec.rb +7 -10
  116. data/spec/parser/simple_commands_spec.rb +10 -10
  117. data/spec/parser/treetop_parser_spec.rb +11 -10
  118. data/spec/parser/var_tuple_spec.rb +7 -11
  119. data/spec/parser/while_command_spec.rb +9 -9
  120. data/spec/runner/board_spec.rb +23 -27
  121. data/spec/runner/cell_spec.rb +34 -38
  122. data/spec/runner/execution_context_spec.rb +38 -24
  123. data/spec/runner/head_spec.rb +54 -63
  124. data/spec/spec_helper.rb +4 -1
  125. data/spec/type_checker_spec.rb +13 -13
  126. metadata +33 -18
  127. data/lib/gobstones/lang/expressions/parentheses_expression.rb +0 -13
  128. data/spec/lang/commands/assignments_spec.rb +0 -13
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 826a27b2e6a5676f89fa8c32624c62df0dde077d
4
- data.tar.gz: 17f89df81a1a217fe6b7a493e30fddb6b7c92a4f
3
+ metadata.gz: 03e20b75d2bb5c93639777a71d19068ae2b69984
4
+ data.tar.gz: fb74916def49acc055a0a028546e0e514b2542cb
5
5
  SHA512:
6
- metadata.gz: 6283b4c01c03a10bc7bf264ff84c2ce9c90b38d1feb10b65f1b5e7364e32e336580cfc13a640215b3dc692671b09bfcc4128c77d5b1827c64041ad766d3ac4a2
7
- data.tar.gz: 261974cfa283b2cca01f5c6ad5b2a050cc7d5bf643b4620345e4c246ad0f8722f0bfe4367fe6abdf9f67e8a9d68311daa42141cea22951bbb2c87494baf31955
6
+ metadata.gz: c3f831d15b2ce307ee9f0c5305e51f17ade931bb27b0ca042ea4f8f58316d290cc40966a9b1e76a4baa0e45d791b3a0341fd20e2606f104d965f6741af67ceca
7
+ data.tar.gz: 6ffabbf50a90cddd4d4dfa8c814d234307af73b1e70906613df903264d17f89dd5564e4bbdebbdd928edfa34240ad987d4737ad096f77370a32f25c259527353
data/.gitignore CHANGED
@@ -1,6 +1,4 @@
1
1
  .rvmrc
2
- *.swp
3
- .rake_t_cache
4
2
  coverage/
5
- tags
6
3
  .idea/
4
+ examples/*.test.gbs
@@ -1 +1 @@
1
- 2.0.0-p195
1
+ 2.2.0
@@ -1,4 +1,4 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.0.0
3
+ - 2.2.0
4
4
  - 1.9.3
data/CHANGELOG CHANGED
@@ -1,4 +1,24 @@
1
- v 0.0.1
2
- =======
1
+ v 0.0.2 (2015.01.10)
2
+ ====================
3
+
4
+ New features:
5
+
6
+ * Support evaluation of function calls
7
+ * Support expression between parentheses
8
+ * Add multiple assignment to the language
9
+ * Add some runtime type checks
10
+
11
+ Bug fixes:
12
+
13
+ * repeatWith command issue (f0e5fa00a178ffad825c6cfdafbfbd333e331f9b)
14
+
15
+ Infrastructure:
16
+
17
+ * Support Ruby 2.2.0 and 1.9.3
18
+ * Upgrade dependencies to latest stable versions
19
+ * Lots of refactorings and new specs (now 316)
20
+
21
+ v 0.0.1 (2013.10.26)
22
+ ====================
3
23
 
4
24
  First version.
data/Gemfile CHANGED
@@ -1,12 +1,12 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  gem 'treetop', '~> 1.4'
4
- gem 'rake', '~> 10.1'
4
+ gem 'rake', '~> 10.4'
5
5
 
6
6
  group :test do
7
7
  gem 'autotest-standalone', '~> 4.5'
8
- gem 'rspec', '~> 2'
8
+ gem 'rspec', '~> 3.1'
9
9
  gem 'simplecov', '~> 0.7', :require => false
10
10
  end
11
11
 
12
- gem 'coveralls', :require => false
12
+ gem 'coveralls', '~> 0.7', :require => false
@@ -2,46 +2,51 @@ GEM
2
2
  remote: https://rubygems.org/
3
3
  specs:
4
4
  autotest-standalone (4.5.11)
5
- coveralls (0.7.0)
5
+ coveralls (0.7.2)
6
6
  multi_json (~> 1.3)
7
- rest-client
7
+ rest-client (= 1.6.7)
8
8
  simplecov (>= 0.7)
9
- term-ansicolor
10
- thor
11
- diff-lcs (1.2.4)
12
- mime-types (1.25)
13
- multi_json (1.8.2)
14
- polyglot (0.3.3)
15
- rake (10.1.0)
9
+ term-ansicolor (= 1.2.2)
10
+ thor (= 0.18.1)
11
+ diff-lcs (1.2.5)
12
+ docile (1.1.5)
13
+ mime-types (2.4.3)
14
+ multi_json (1.10.1)
15
+ polyglot (0.3.5)
16
+ rake (10.4.2)
16
17
  rest-client (1.6.7)
17
18
  mime-types (>= 1.16)
18
- rspec (2.14.1)
19
- rspec-core (~> 2.14.0)
20
- rspec-expectations (~> 2.14.0)
21
- rspec-mocks (~> 2.14.0)
22
- rspec-core (2.14.6)
23
- rspec-expectations (2.14.3)
24
- diff-lcs (>= 1.1.3, < 2.0)
25
- rspec-mocks (2.14.4)
26
- simplecov (0.7.1)
19
+ rspec (3.1.0)
20
+ rspec-core (~> 3.1.0)
21
+ rspec-expectations (~> 3.1.0)
22
+ rspec-mocks (~> 3.1.0)
23
+ rspec-core (3.1.7)
24
+ rspec-support (~> 3.1.0)
25
+ rspec-expectations (3.1.2)
26
+ diff-lcs (>= 1.2.0, < 2.0)
27
+ rspec-support (~> 3.1.0)
28
+ rspec-mocks (3.1.3)
29
+ rspec-support (~> 3.1.0)
30
+ rspec-support (3.1.2)
31
+ simplecov (0.9.1)
32
+ docile (~> 1.1.0)
27
33
  multi_json (~> 1.0)
28
- simplecov-html (~> 0.7.1)
29
- simplecov-html (0.7.1)
34
+ simplecov-html (~> 0.8.0)
35
+ simplecov-html (0.8.0)
30
36
  term-ansicolor (1.2.2)
31
37
  tins (~> 0.8)
32
38
  thor (0.18.1)
33
- tins (0.12.0)
34
- treetop (1.4.15)
35
- polyglot
36
- polyglot (>= 0.3.1)
39
+ tins (0.13.2)
40
+ treetop (1.5.3)
41
+ polyglot (~> 0.3)
37
42
 
38
43
  PLATFORMS
39
44
  ruby
40
45
 
41
46
  DEPENDENCIES
42
47
  autotest-standalone (~> 4.5)
43
- coveralls
44
- rake (~> 10.1)
45
- rspec (~> 2)
48
+ coveralls (~> 0.7)
49
+ rake (~> 10.4)
50
+ rspec (~> 3.1)
46
51
  simplecov (~> 0.7)
47
52
  treetop (~> 1.4)
@@ -9,4 +9,4 @@ if gbs_file
9
9
  Gobstones::CLI::Runner.run(gbs_file)
10
10
  else
11
11
  puts 'No Gobstones program specified'
12
- end
12
+ end
File without changes
@@ -3,7 +3,7 @@ $:.unshift lib unless $:.include?(lib)
3
3
 
4
4
  Gem::Specification.new do |spec|
5
5
  spec.name = 'gobstones'
6
- spec.version = '0.0.1.1'
6
+ spec.version = '0.0.2'
7
7
  spec.licenses = ['GPLv3']
8
8
  spec.authors = ['Nahuel Garbezza']
9
9
  spec.email = ['n.garbezza@gmail.com']
@@ -14,7 +14,7 @@ Gem::Specification.new do |spec|
14
14
  spec.required_ruby_version = '>= 1.9.3'
15
15
  spec.required_rubygems_version = '>= 1.3.6'
16
16
 
17
- spec.add_development_dependency 'rspec', '~> 2'
17
+ spec.add_development_dependency 'rspec', '~> 3'
18
18
 
19
19
  spec.files = `git ls-files`.split $/
20
20
  spec.test_files = spec.files.grep %r{^spec/}
@@ -36,4 +36,4 @@
36
36
  0 | | | | | | | | | | 0
37
37
  | | | | | | | | | |
38
38
  +---------+---------+---------+---------+---------+---------+---------+---------+---------+
39
- 0 1 2 3 4 5 6 7 8
39
+ 0 1 2 3 4 5 6 7 8
@@ -103,4 +103,4 @@ module Gobstones
103
103
 
104
104
  end
105
105
 
106
- end
106
+ end
@@ -23,6 +23,8 @@ module Gobstones
23
23
  print_program_result parse_program.evaluate
24
24
  rescue Gobstones::Parser::ParseError => parse_error
25
25
  handle_parse_error parse_error
26
+ rescue Gobstones::Runner::GobstonesTypeError => type_error
27
+ handle_type_error type_error
26
28
  rescue Exception => e
27
29
  # TODO handle more gobstones exceptions
28
30
  raise e
@@ -35,7 +37,7 @@ module Gobstones
35
37
  end
36
38
 
37
39
  def parse_program
38
- @parser.parse(@code)
40
+ @parser.parse @code
39
41
  end
40
42
 
41
43
  def handle_parse_error(parse_error)
@@ -45,8 +47,12 @@ module Gobstones
45
47
  puts "#{'~' * (parse_error.parser.failure_column - 1)}^"
46
48
  end
47
49
 
50
+ def handle_type_error(type_error)
51
+ puts "Type Error: #{type_error.message} occurred in #{type_error.statement}"
52
+ end
53
+
48
54
  end
49
55
 
50
56
  end
51
57
 
52
- end
58
+ end
@@ -1,2 +1,3 @@
1
+ require 'gobstones/extensions/boolean'
1
2
  require 'gobstones/extensions/fixnum'
2
- require 'gobstones/extensions/boolean'
3
+ require 'gobstones/extensions/string'
@@ -14,4 +14,4 @@ class FalseClass
14
14
  Gobstones::Lang::False.new
15
15
  end
16
16
 
17
- end
17
+ end
@@ -6,4 +6,4 @@ class Fixnum
6
6
  Gobstones::Lang::Number.new self
7
7
  end
8
8
 
9
- end
9
+ end
@@ -0,0 +1,9 @@
1
+ require 'gobstones/lang/expressions/var_name'
2
+
3
+ class String
4
+
5
+ def to_var_name
6
+ Gobstones::Lang::VarName.new self
7
+ end
8
+
9
+ end
@@ -2,4 +2,4 @@ require 'gobstones/lang/literals/all'
2
2
  require 'gobstones/lang/expressions/all'
3
3
  require 'gobstones/lang/commands/all'
4
4
  require 'gobstones/lang/definitions/all'
5
- require 'gobstones/lang/program'
5
+ require 'gobstones/lang/program'
@@ -1,13 +1,14 @@
1
- require 'gobstones/lang/commands/assignments'
2
1
  require 'gobstones/lang/commands/boom_cmd'
3
2
  require 'gobstones/lang/commands/command_block'
4
3
  require 'gobstones/lang/commands/if_cmd'
5
4
  require 'gobstones/lang/commands/ir_al_origen_cmd'
6
5
  require 'gobstones/lang/commands/mover_cmd'
6
+ require 'gobstones/lang/commands/multiple_assignment'
7
7
  require 'gobstones/lang/commands/poner_cmd'
8
8
  require 'gobstones/lang/commands/procedure_call'
9
9
  require 'gobstones/lang/commands/repeat_with_cmd'
10
10
  require 'gobstones/lang/commands/sacar_cmd'
11
+ require 'gobstones/lang/commands/single_assignment'
11
12
  require 'gobstones/lang/commands/skip_cmd'
12
13
  require 'gobstones/lang/commands/vaciar_tablero_cmd'
13
- require 'gobstones/lang/commands/while_cmd'
14
+ require 'gobstones/lang/commands/while_cmd'
@@ -1,4 +1,5 @@
1
1
  require 'gobstones/runner/errors/boom_error'
2
+ require 'gobstones/modules/equal_by_class'
2
3
 
3
4
  module Gobstones
4
5
 
@@ -6,6 +7,8 @@ module Gobstones
6
7
 
7
8
  class Boom
8
9
 
10
+ include Gobstones::EqualByClass
11
+
9
12
  attr_reader :message
10
13
 
11
14
  def initialize(message)
@@ -13,11 +16,11 @@ module Gobstones
13
16
  end
14
17
 
15
18
  def ==(other)
16
- self.class == other.class &&
19
+ super(other) &&
17
20
  self.message == other.message
18
21
  end
19
22
 
20
- def evaluate(context=nil)
23
+ def evaluate(context)
21
24
  raise Gobstones::Runner::BoomError, message
22
25
  end
23
26
 
@@ -25,4 +28,4 @@ module Gobstones
25
28
 
26
29
  end
27
30
 
28
- end
31
+ end
@@ -4,7 +4,7 @@ module Gobstones
4
4
 
5
5
  module Lang
6
6
 
7
- class CmdBlock
7
+ class CommandBlock
8
8
 
9
9
  include Gobstones::EqualByClass
10
10
 
@@ -1,9 +1,13 @@
1
+ require 'gobstones/modules/equal_by_class'
2
+
1
3
  module Gobstones
2
4
 
3
5
  module Lang
4
6
 
5
7
  class ConditionalCmd
6
8
 
9
+ include Gobstones::EqualByClass
10
+
7
11
  attr_reader :condition, :then_block
8
12
 
9
13
  def initialize(condition, then_block)
@@ -11,7 +15,7 @@ module Gobstones
11
15
  end
12
16
 
13
17
  def ==(other)
14
- self.class == other.class &&
18
+ super(other) &&
15
19
  self.condition == other.condition &&
16
20
  self.then_block == other.then_block
17
21
  end
@@ -16,4 +16,4 @@ module Gobstones
16
16
 
17
17
  end
18
18
 
19
- end
19
+ end
@@ -7,7 +7,9 @@ module Gobstones
7
7
  class Mover < OneArgExpression
8
8
 
9
9
  def evaluate(context)
10
- context.head.move arg.evaluate(context)
10
+ with_evaluated_argument_in(context) do |result|
11
+ context.head.move result
12
+ end
11
13
  end
12
14
 
13
15
  def undo(context)
@@ -15,7 +17,7 @@ module Gobstones
15
17
  end
16
18
 
17
19
  def opposite
18
- Mover.new arg.opposite
20
+ Mover.new argument.opposite
19
21
  end
20
22
 
21
23
  end
@@ -0,0 +1,35 @@
1
+ require 'gobstones/modules/equal_by_class'
2
+
3
+ module Gobstones
4
+
5
+ module Lang
6
+
7
+ class MultipleAssignment
8
+
9
+ include Gobstones::EqualByClass
10
+
11
+ attr_reader :var_tuple, :expression
12
+
13
+ def initialize(var_tuple, expression)
14
+ @var_tuple, @expression = var_tuple, expression
15
+ end
16
+
17
+ def ==(other)
18
+ super(other) &&
19
+ self.var_tuple == other.var_tuple &&
20
+ self.expression == other.expression
21
+ end
22
+
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]
28
+ end
29
+ end
30
+
31
+ end
32
+
33
+ end
34
+
35
+ end
@@ -9,7 +9,9 @@ module Gobstones
9
9
  class Poner < OneArgExpression
10
10
 
11
11
  def evaluate(context)
12
- context.head.put arg.evaluate(context)
12
+ with_evaluated_argument_in(context) do |result|
13
+ context.head.put result
14
+ end
13
15
  rescue RuntimeError => e
14
16
  raise Gobstones::Runner::GobstonesTypeError, e.message
15
17
  end
@@ -17,15 +19,17 @@ module Gobstones
17
19
  def undo(context)
18
20
  # TODO maybe the command should use the original context
19
21
  # instead of this one (when it was executed)
20
- context.head.take_out arg.evaluate(context)
22
+ with_evaluated_argument_in(context) do |result|
23
+ context.head.take_out result
24
+ end
21
25
  end
22
26
 
23
27
  def opposite
24
- Sacar.new arg
28
+ Sacar.new argument
25
29
  end
26
30
 
27
31
  end
28
32
 
29
33
  end
30
34
 
31
- end
35
+ end