alphalang 0.2.3 → 0.2.5

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