alphalang 0.2.3 → 0.2.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c46055bf730f2a26ce876fcc685a711359a5e80710da1e86e7eac6e7554af007
4
- data.tar.gz: d2751a739b78101ce213c6b29db88fbcc57a0c33dad4282f5bf1d5e385ba7461
3
+ metadata.gz: 8f0ae223746d2a819889026bde1c6ec27b0d331567aa0734fdbbc824b45d4625
4
+ data.tar.gz: d3b0e9a67edcd936217b50d931c3993ab32c5c8efca805cb1dfbe0a6b260fa3e
5
5
  SHA512:
6
- metadata.gz: c873cf09f9c0831cbfd15a9f7cdc01a29e2bbe035cf9b04033ea5b6c14be54a7b95d34ed278658892ce9c56e6b1ab81ed998e220ca8a21898c08efe8c4feb2e2
7
- data.tar.gz: a34c736242f1b4ab7a5f42d1a3173ada74add81c83e1d6da106c91ccef75f457b2bb73e18bca3f81264c1f0a6ab1b3d09c8edd737ecb4d443623858ef4502674
6
+ metadata.gz: 5022eaae630f0fbc43485f5b5bf3d55e3c0bcc577818edc2f2aeb209f2f323ca233c2ae6d015f296a47caf45c5958626f5d69a6be9e8100fdf3b104f48ab2571
7
+ data.tar.gz: ae51f1d99f90e029b9a2569dd5cb3bb78c48f06bb080781b0c5a3631d05433d922eb990790f2a985dd0435fe4461f98cbbb1004e7b47e40399574271f96929b6
@@ -2,30 +2,6 @@
2
2
 
3
3
  ####################################################
4
4
 
5
- class TrueClass
6
- def evaluate
7
- self
8
- end
9
- end
10
-
11
- class FalseClass
12
- def evaluate
13
- self
14
- end
15
- end
16
-
17
- class String
18
- def name
19
- self
20
- end
21
-
22
- def evaluate
23
- self
24
- end
25
- end
26
-
27
- ####################################################
28
-
29
5
  class Node
30
6
  attr_accessor :value
31
7
 
@@ -58,7 +34,6 @@ end
58
34
 
59
35
  class BoolNode < Node
60
36
  def initialize(value)
61
- @value = false
62
37
  @value = true if value == ScopeManager.true_value
63
38
  @value = false if value == ScopeManager.false_value
64
39
  end
@@ -69,32 +44,32 @@ class BoolNode < Node
69
44
  end
70
45
 
71
46
  class AndNode < Node
72
- def initialize(node1, node2)
73
- @node1, @node2 = node1, node2
74
- if @node2.class.method_defined? (:lhs)
75
- if @node2.lhs == nil
76
- @node2.lhs = @node1.lhs
47
+ def initialize(lhs, rhs)
48
+ @lhs, @rhs = lhs, rhs
49
+ if @rhs.class.method_defined? (:lhs)
50
+ if @rhs.lhs == nil
51
+ @rhs.lhs = @lhs.lhs
77
52
  end
78
53
  end
79
54
  end
80
55
 
81
56
  def evaluate
82
- @node1.evaluate && @node2.evaluate
57
+ @lhs.evaluate && @rhs.evaluate
83
58
  end
84
59
  end
85
60
 
86
61
  class OrNode < Node
87
- def initialize(node1, node2)
88
- @node1, @node2 = node1, node2
89
- if @node2.class.method_defined? (:lhs)
90
- if @node2.lhs == nil
91
- @node2.lhs = @node1.lhs
62
+ def initialize(lhs, rhs)
63
+ @lhs, @rhs = lhs, rhs
64
+ if @rhs.class.method_defined? (:lhs)
65
+ if @rhs.lhs == nil
66
+ @rhs.lhs = @lhs.lhs
92
67
  end
93
68
  end
94
69
  end
95
70
 
96
71
  def evaluate
97
- @node1.evaluate || @node2.evaluate
72
+ @lhs.evaluate || @rhs.evaluate
98
73
  end
99
74
  end
100
75
 
@@ -113,8 +88,8 @@ end
113
88
  class CompareNode < Node
114
89
  attr_accessor :lhs, :op, :rhs
115
90
 
116
- def initialize(node1, op, node2)
117
- @lhs, @op, @rhs = node1, op, node2
91
+ def initialize(lhs, op, rhs)
92
+ @lhs, @op, @rhs = lhs, op, rhs
118
93
  end
119
94
 
120
95
  def evaluate
@@ -137,6 +112,16 @@ class BinaryOperationNode < Node
137
112
  return @value = @lhs.evaluate.append(@rhs.evaluate)
138
113
  end
139
114
 
115
+ if @rhs.evaluate.is_a?(ArrayNode) && @op == '-'
116
+ return @value = @rhs.evaluate - @lhs.evaluate
117
+ elsif @lhs.evaluate.is_a?(Array) && @op == '-'
118
+ return @lhs.evaluate.reject { |v| v.evaluate == @rhs.evaluate }
119
+ end
120
+
121
+ if @rhs.evaluate.is_a?(ArrayNode) or @rhs.evaluate.is_a?(Array) and @lhs.evaluate.is_a?(Numeric)
122
+ raise SyntaxError, "You can't subtract and array from a number! #{@lhs.evaluate} #{@op} #{@rhs.name}"
123
+ end
124
+
140
125
  if @op == '/'
141
126
  @value = @lhs.evaluate.to_f.send(@op, @rhs.evaluate)
142
127
  else
@@ -186,8 +171,16 @@ class ArrayNode < Node
186
171
  puts @value.join(', ')
187
172
  end
188
173
 
189
- def +(index)
190
- @value.append(index)
174
+ def to_s
175
+ @value.join(', ')
176
+ end
177
+
178
+ def +(value)
179
+ @value.append(value)
180
+ end
181
+
182
+ def -(value)
183
+ @value.reject { |v| v.evaluate == value }
191
184
  end
192
185
 
193
186
  def [](index)
@@ -56,7 +56,11 @@ class ScopeManager
56
56
  end
57
57
 
58
58
  def self.add_to_current_scope(name, value)
59
- @@scopes[@@scope_lvl][name.name] = value.evaluate
59
+ if name.is_a?(String)
60
+ @@scopes[@@scope_lvl][name] = value.evaluate
61
+ else
62
+ @@scopes[@@scope_lvl][name.name] = value.evaluate
63
+ end
60
64
  end
61
65
 
62
66
  def self.add_func_to_global_scope(name, value, args)
@@ -94,32 +94,28 @@ class IfNode < Node
94
94
  end
95
95
 
96
96
  def evaluate
97
- if @argument.evaluate
98
- @value = @node.evaluate
99
- else
100
- @value = nil
101
- end
102
- @value
97
+ @value = @node.evaluate
103
98
  end
104
99
  end
105
100
 
106
101
  class ElseifNode < Node
107
102
  attr_accessor :argument
103
+
108
104
  def initialize(argument, node)
109
105
  @argument, @node = argument, node
110
106
  end
107
+
111
108
  def evaluate
112
- if @argument.evaluate
113
- @value = @node.evaluate
114
- end
109
+ @value = @node.evaluate
115
110
  end
116
111
  end
117
112
 
118
113
  class ElseNode < Node
119
114
  attr_accessor :argument, :node
115
+
120
116
  def initialize(node)
121
117
  @node = node
122
- @argument = true
118
+ @argument = BoolNode.new(ScopeManager.true_value)
123
119
  end
124
120
 
125
121
  def evaluate
@@ -189,11 +185,18 @@ class PrintNode
189
185
  def evaluate
190
186
  if @value.evaluate.is_a?(ArrayNode)
191
187
  print "Array #{@value.name}: "
192
- @value.evaluate.display_on_one_line
188
+ puts @value.evaluate
193
189
  elsif @value.evaluate.is_a?(Array)
194
190
  print "Array #{@value.name}: "
195
191
  puts @value.evaluate.join(', ')
196
192
  else
193
+ if @value.evaluate == PrintNode
194
+ if @value.value.is_a?(VariableCallNode)
195
+ raise SyntaxError, "You have a duplicate 'print' statement! Printing #{@value.value.name} twice."
196
+ else
197
+ raise SyntaxError, "You have a duplicate 'print' statement! Printing #{@value.value} twice."
198
+ end
199
+ end
197
200
  puts @value.evaluate
198
201
  end
199
202
  self.class
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: alphalang
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.2.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - mattias, victor