delorean_lang 0.0.39 → 0.0.40
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.
- data/lib/delorean/functions.rb +54 -1
- data/lib/delorean/nodes.rb +1 -1
- data/lib/delorean/version.rb +1 -1
- data/spec/func_spec.rb +34 -0
- metadata +2 -2
data/lib/delorean/functions.rb
CHANGED
|
@@ -26,6 +26,8 @@ module Delorean
|
|
|
26
26
|
|
|
27
27
|
MAXLIST_SIG = [ 1, 1 ]
|
|
28
28
|
|
|
29
|
+
######################################################################
|
|
30
|
+
|
|
29
31
|
def MINLIST(_e, arg)
|
|
30
32
|
raise "argument must be list" unless arg.is_a? Array
|
|
31
33
|
arg.min
|
|
@@ -43,8 +45,19 @@ module Delorean
|
|
|
43
45
|
|
|
44
46
|
######################################################################
|
|
45
47
|
|
|
48
|
+
def ABS(_e, n)
|
|
49
|
+
raise "#{n} is not a number" unless
|
|
50
|
+
n.is_a?(Float) || n.is_a?(Fixnum) || n.is_a?(BigDecimal)
|
|
51
|
+
n.abs
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
ABS_SIG = [ 1, 1 ]
|
|
55
|
+
|
|
56
|
+
######################################################################
|
|
57
|
+
|
|
46
58
|
def NUMBER(_e, s)
|
|
47
|
-
|
|
59
|
+
# FIXME: handle BigDecimal
|
|
60
|
+
return s if s.is_a?(Float) || s.is_a?(Fixnum) || s.is_a?(BigDecimal)
|
|
48
61
|
raise "Can't convert #{s} to number" unless
|
|
49
62
|
s =~ /^\d+(\.\d+)?$/
|
|
50
63
|
|
|
@@ -138,5 +151,45 @@ module Delorean
|
|
|
138
151
|
|
|
139
152
|
######################################################################
|
|
140
153
|
|
|
154
|
+
RUBY_METHODS = {
|
|
155
|
+
sort: [Array],
|
|
156
|
+
reverse: [Array],
|
|
157
|
+
min: [Array],
|
|
158
|
+
max: [Array],
|
|
159
|
+
uniq: [Array],
|
|
160
|
+
length: [[Array, String]],
|
|
161
|
+
flatten: [Array, [Fixnum, nil]],
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
def RUBY(_e, method, *args)
|
|
165
|
+
raise "method must be a string" unless method.class.name=="String"
|
|
166
|
+
msg = method.to_sym
|
|
167
|
+
|
|
168
|
+
raise "no such method #{method}" unless RUBY_METHODS.member? msg
|
|
169
|
+
|
|
170
|
+
sig = RUBY_METHODS[msg]
|
|
171
|
+
raise "too many args to #{method}" if args.length>sig.length
|
|
172
|
+
|
|
173
|
+
sig.each_with_index { |s, i|
|
|
174
|
+
s = [s] unless s.is_a?(Array)
|
|
175
|
+
|
|
176
|
+
ok = false
|
|
177
|
+
s.each { |sc|
|
|
178
|
+
if (sc.nil? && i>=args.length) || (sc && args[i].class <= sc)
|
|
179
|
+
ok = true
|
|
180
|
+
break
|
|
181
|
+
end
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
raise "bad argument #{args[i]} at position #{i} to method #{method}" unless ok
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
args[0].send(msg, *args[1, args.length])
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
RUBY_SIG = [ 1, Float::INFINITY ]
|
|
191
|
+
|
|
192
|
+
######################################################################
|
|
193
|
+
|
|
141
194
|
end
|
|
142
195
|
end
|
data/lib/delorean/nodes.rb
CHANGED
data/lib/delorean/version.rb
CHANGED
data/spec/func_spec.rb
CHANGED
|
@@ -79,6 +79,18 @@ describe "Delorean" do
|
|
|
79
79
|
r.should == [12.3456, 12.3456, 12]
|
|
80
80
|
end
|
|
81
81
|
|
|
82
|
+
it "should handle ABS" do
|
|
83
|
+
engine.parse defn("A:",
|
|
84
|
+
" a = ABS(-123)",
|
|
85
|
+
" b = ABS(-1.1)",
|
|
86
|
+
" c = ABS(2.3)",
|
|
87
|
+
" d = ABS(0)",
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
r = engine.evaluate_attrs("A", ["a", "b", "c", "d"])
|
|
91
|
+
r.should == [123, 1.1, 2.3, 0]
|
|
92
|
+
end
|
|
93
|
+
|
|
82
94
|
it "should handle STRING" do
|
|
83
95
|
engine.parse defn("A:",
|
|
84
96
|
" a = STRING('hello')",
|
|
@@ -191,6 +203,28 @@ describe "Delorean" do
|
|
|
191
203
|
lambda {
|
|
192
204
|
r = engine.evaluate("A", "b")
|
|
193
205
|
}.should raise_error("xx, 1, 2, 3")
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
it "should handle RUBY" do
|
|
209
|
+
x = [[1, 2, [-3]], 4, 5, [6], -3, 4, 5, 0]
|
|
194
210
|
|
|
211
|
+
engine.parse defn("A:",
|
|
212
|
+
" a = #{x}",
|
|
213
|
+
" b = RUBY('flatten', a)",
|
|
214
|
+
" c = RUBY('flatten', a, 1)",
|
|
215
|
+
" d = b+c",
|
|
216
|
+
" dd = RUBY('flatten', d)",
|
|
217
|
+
" e = RUBY('sort', dd)",
|
|
218
|
+
" f = RUBY('uniq', e)",
|
|
219
|
+
" g = RUBY('length', e)",
|
|
220
|
+
)
|
|
221
|
+
|
|
222
|
+
engine.evaluate("A", "c").should == x.flatten(1)
|
|
223
|
+
d = engine.evaluate("A", "d").should == x.flatten + x.flatten(1)
|
|
224
|
+
dd = engine.evaluate("A", "dd")
|
|
225
|
+
engine.evaluate("A", "e").should == dd.sort
|
|
226
|
+
engine.evaluate("A", "f").should == dd.sort.uniq
|
|
227
|
+
engine.evaluate("A", "g").should == dd.length
|
|
195
228
|
end
|
|
229
|
+
|
|
196
230
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: delorean_lang
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.40
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2013-02-
|
|
12
|
+
date: 2013-02-19 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: treetop
|