q-language 1.0.0
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/.gemtest +0 -0
- data/Rakefile +10 -0
- data/lib/q-language.rb +9 -0
- data/lib/q-language/device.rb +166 -0
- data/lib/q-language/environment.rb +358 -0
- data/lib/q-language/methods/array.rb +523 -0
- data/lib/q-language/methods/block.rb +26 -0
- data/lib/q-language/methods/class.rb +24 -0
- data/lib/q-language/methods/dynamic.rb +82 -0
- data/lib/q-language/methods/false.rb +47 -0
- data/lib/q-language/methods/hash.rb +351 -0
- data/lib/q-language/methods/implicit.rb +345 -0
- data/lib/q-language/methods/module.rb +39 -0
- data/lib/q-language/methods/nil.rb +47 -0
- data/lib/q-language/methods/number.rb +118 -0
- data/lib/q-language/methods/object.rb +155 -0
- data/lib/q-language/methods/string.rb +157 -0
- data/lib/q-language/methods/time.rb +110 -0
- data/lib/q-language/methods/token.rb +72 -0
- data/lib/q-language/methods/true.rb +14 -0
- data/lib/q-language/node.rb +45 -0
- data/lib/q-language/object.rb +125 -0
- data/lib/q-language/parser.rb +104 -0
- data/lib/q-language/writer.rb +90 -0
- data/test/methods/test_array.rb +191 -0
- data/test/methods/test_block.rb +66 -0
- data/test/methods/test_class.rb +34 -0
- data/test/methods/test_dynamic.rb +158 -0
- data/test/methods/test_false.rb +60 -0
- data/test/methods/test_hash.rb +10 -0
- data/test/methods/test_implicit.rb +332 -0
- data/test/methods/test_module.rb +55 -0
- data/test/methods/test_nil.rb +60 -0
- data/test/methods/test_number.rb +10 -0
- data/test/methods/test_object.rb +157 -0
- data/test/methods/test_string.rb +271 -0
- data/test/methods/test_time.rb +181 -0
- data/test/methods/test_token.rb +92 -0
- data/test/methods/test_true.rb +16 -0
- data/test/test.rb +23 -0
- metadata +103 -0
@@ -0,0 +1,26 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
#
|
3
|
+
# Copyright © 2010-2011 Jesse Sielaff
|
4
|
+
#
|
5
|
+
|
6
|
+
class QBlock < QObject
|
7
|
+
def block?
|
8
|
+
value
|
9
|
+
end
|
10
|
+
|
11
|
+
def call
|
12
|
+
value.call
|
13
|
+
end
|
14
|
+
|
15
|
+
def call_arg (object)
|
16
|
+
value.call(object)
|
17
|
+
end
|
18
|
+
|
19
|
+
def eval (dynamic)
|
20
|
+
env::frame(dynamic) { value.call }
|
21
|
+
end
|
22
|
+
|
23
|
+
def eval_arg (dynamic, object)
|
24
|
+
env::frame(dynamic) { value.call(object) }
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
#
|
3
|
+
# Copyright © 2010-2011 Jesse Sielaff
|
4
|
+
#
|
5
|
+
|
6
|
+
class QClass < QModule
|
7
|
+
def class?
|
8
|
+
value
|
9
|
+
end
|
10
|
+
|
11
|
+
def init (object)
|
12
|
+
obj = value.new
|
13
|
+
obj.instance_variable_set(:"@init", object)
|
14
|
+
obj
|
15
|
+
end
|
16
|
+
|
17
|
+
def module?
|
18
|
+
false
|
19
|
+
end
|
20
|
+
|
21
|
+
def new
|
22
|
+
value.new
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
#
|
3
|
+
# Copyright © 2010-2011 Jesse Sielaff
|
4
|
+
#
|
5
|
+
|
6
|
+
class QDynamic < QObject
|
7
|
+
def def (token, &block)
|
8
|
+
env = self.env::replicate
|
9
|
+
|
10
|
+
value.define_singleton_method(:"__Q_#{token}__") do |object = nil|
|
11
|
+
env::frame(self) { block.call(object, env) }
|
12
|
+
end
|
13
|
+
|
14
|
+
env = self.env::replicate
|
15
|
+
env.max_nodes = self.env.max_method_nodes
|
16
|
+
|
17
|
+
value.define_singleton_method(token) do |object = nil|
|
18
|
+
begin
|
19
|
+
env::frame(self) { block.call(object, env) }
|
20
|
+
rescue Q_Environment::TooManyNodes
|
21
|
+
nil
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
value
|
26
|
+
end
|
27
|
+
|
28
|
+
def dynamic?
|
29
|
+
value
|
30
|
+
end
|
31
|
+
|
32
|
+
def eval (&block)
|
33
|
+
env::frame(value) { block.call }
|
34
|
+
end
|
35
|
+
|
36
|
+
def eval_arg (object, &block)
|
37
|
+
env::frame(value) { block.call(object) }
|
38
|
+
end
|
39
|
+
|
40
|
+
def extend (module_1)
|
41
|
+
value.extend(module_1) if module_1.instance_of?(Module)
|
42
|
+
value
|
43
|
+
end
|
44
|
+
|
45
|
+
def iget (token)
|
46
|
+
value.instance_variable_get(:"@#{token}")
|
47
|
+
rescue NameError
|
48
|
+
# Illegal name for instance variable
|
49
|
+
nil
|
50
|
+
end
|
51
|
+
|
52
|
+
def init_value
|
53
|
+
value.instance_variable_get(:"@init")
|
54
|
+
end
|
55
|
+
|
56
|
+
def instance? (class_1)
|
57
|
+
value.instance_of?(class_1)
|
58
|
+
end
|
59
|
+
|
60
|
+
def is? (module_1)
|
61
|
+
value.is_a?(module_1)
|
62
|
+
end
|
63
|
+
|
64
|
+
def iset (token, object)
|
65
|
+
value.instance_variable_set(:"@#{token}", object)
|
66
|
+
rescue NameError
|
67
|
+
# Illegal name for instance variable
|
68
|
+
nil
|
69
|
+
end
|
70
|
+
|
71
|
+
def metaclass
|
72
|
+
value.class
|
73
|
+
end
|
74
|
+
|
75
|
+
def send (token)
|
76
|
+
value.__send__(:"__Q_#{token}__", nil) rescue nil
|
77
|
+
end
|
78
|
+
|
79
|
+
def send_arg (token, object)
|
80
|
+
value.__send__(:"__Q_#{token}__", object) rescue value
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
#
|
3
|
+
# Copyright © 2010-2011 Jesse Sielaff
|
4
|
+
#
|
5
|
+
|
6
|
+
class QFalse < QObject
|
7
|
+
def and (object)
|
8
|
+
false
|
9
|
+
end
|
10
|
+
|
11
|
+
def choose (object_1, object_2)
|
12
|
+
object_2
|
13
|
+
end
|
14
|
+
|
15
|
+
def false?
|
16
|
+
true
|
17
|
+
end
|
18
|
+
|
19
|
+
def if (&block)
|
20
|
+
nil
|
21
|
+
end
|
22
|
+
|
23
|
+
def not
|
24
|
+
true
|
25
|
+
end
|
26
|
+
|
27
|
+
def or (object)
|
28
|
+
object
|
29
|
+
end
|
30
|
+
|
31
|
+
def stringify
|
32
|
+
"false"
|
33
|
+
end
|
34
|
+
|
35
|
+
def tally
|
36
|
+
-1
|
37
|
+
end
|
38
|
+
|
39
|
+
def unless (&block)
|
40
|
+
env::jump!
|
41
|
+
yield
|
42
|
+
end
|
43
|
+
|
44
|
+
def xor (object)
|
45
|
+
!!object
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,351 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
#
|
3
|
+
# Copyright © 2010-2011 Jesse Sielaff
|
4
|
+
#
|
5
|
+
|
6
|
+
class QHash < QObject
|
7
|
+
def any? (&block)
|
8
|
+
value.any? do |obj|
|
9
|
+
result = yield obj
|
10
|
+
break result if env::break?
|
11
|
+
result
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def all? (&block)
|
16
|
+
value.all? do |obj|
|
17
|
+
result = yield obj
|
18
|
+
break result if env::break?
|
19
|
+
result
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def clear
|
24
|
+
value.clear
|
25
|
+
end
|
26
|
+
|
27
|
+
def count_by (&block)
|
28
|
+
value.count do |obj|
|
29
|
+
result = yield obj
|
30
|
+
break result if env::break?
|
31
|
+
result
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def cycle (&block)
|
36
|
+
value.cycle do |obj|
|
37
|
+
result = yield obj
|
38
|
+
break result if env::break?
|
39
|
+
result
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def cycle_n (number, &block)
|
44
|
+
value.cycle(number) do |obj|
|
45
|
+
result = yield obj
|
46
|
+
break result if env::break?
|
47
|
+
result
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def delete (object)
|
52
|
+
value.delete(object)
|
53
|
+
end
|
54
|
+
|
55
|
+
def delete_if (&block)
|
56
|
+
value.delete_if do |obj|
|
57
|
+
result = yield obj
|
58
|
+
break result if env::break?
|
59
|
+
result
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def drop (number)
|
64
|
+
return value.dup if number < 0
|
65
|
+
value.drop(number)
|
66
|
+
end
|
67
|
+
|
68
|
+
def drop_while (&block)
|
69
|
+
value.drop_while do |obj|
|
70
|
+
result = yield obj
|
71
|
+
break result if env::break?
|
72
|
+
result
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def each (&block)
|
77
|
+
value.each do |obj|
|
78
|
+
result = yield obj
|
79
|
+
break result if env::break?
|
80
|
+
result
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def each_cons (&block)
|
85
|
+
return nil unless number > 0
|
86
|
+
|
87
|
+
value.each_cons do |obj|
|
88
|
+
result = yield obj
|
89
|
+
break result if env::break?
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def each_key (&block)
|
94
|
+
value.each_key do |obj|
|
95
|
+
result = yield obj
|
96
|
+
break result if env::break?
|
97
|
+
result
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def each_slice (&block)
|
102
|
+
return nil unless number > 0
|
103
|
+
|
104
|
+
value.each_slice do |obj|
|
105
|
+
result = yield obj
|
106
|
+
break result if env::break?
|
107
|
+
result
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def each_value (&block)
|
112
|
+
value.each_value do |obj|
|
113
|
+
result = yield obj
|
114
|
+
break result if env::break?
|
115
|
+
result
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def each_with_index (&block)
|
120
|
+
value.each_with_index do |(k,v), i|
|
121
|
+
result = yield [k,v,i]
|
122
|
+
break result if env::break?
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def each_with_object (object, &block)
|
127
|
+
value.each_with_object(object) do |(k,v), o|
|
128
|
+
result = yield [k,v,o]
|
129
|
+
break result if env::break?
|
130
|
+
end
|
131
|
+
|
132
|
+
object
|
133
|
+
end
|
134
|
+
|
135
|
+
def empty?
|
136
|
+
value.empty?
|
137
|
+
end
|
138
|
+
|
139
|
+
def find (&block)
|
140
|
+
value.find do |obj|
|
141
|
+
result = yield obj
|
142
|
+
break result if env::break?
|
143
|
+
result
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
def flatten
|
148
|
+
value.flatten
|
149
|
+
end
|
150
|
+
|
151
|
+
def get (object)
|
152
|
+
value[object]
|
153
|
+
end
|
154
|
+
|
155
|
+
def group_by (&block)
|
156
|
+
value.group_by do |obj|
|
157
|
+
result = yield obj
|
158
|
+
break result if env::break?
|
159
|
+
result
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
def hash?
|
164
|
+
value
|
165
|
+
end
|
166
|
+
|
167
|
+
def inject (object, &block)
|
168
|
+
value.inject(object) do |o,(k,v)|
|
169
|
+
result = yield [o,k,v]
|
170
|
+
break result if env::break?
|
171
|
+
result
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
def invert
|
176
|
+
value.invert
|
177
|
+
end
|
178
|
+
|
179
|
+
def key (object)
|
180
|
+
value.key(object)
|
181
|
+
end
|
182
|
+
|
183
|
+
def key? (object)
|
184
|
+
value.has_key?(object)
|
185
|
+
end
|
186
|
+
|
187
|
+
def keys
|
188
|
+
value.keys
|
189
|
+
end
|
190
|
+
|
191
|
+
def length
|
192
|
+
value.length
|
193
|
+
end
|
194
|
+
|
195
|
+
def many? (&block)
|
196
|
+
value.count do |obj|
|
197
|
+
result = yield obj
|
198
|
+
return result if env::break?
|
199
|
+
result
|
200
|
+
end > 1
|
201
|
+
end
|
202
|
+
|
203
|
+
def map (&block)
|
204
|
+
value.collect do |obj|
|
205
|
+
result = yield obj
|
206
|
+
break result if env::break?
|
207
|
+
result
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
def max
|
212
|
+
value.max
|
213
|
+
rescue ArgumentError
|
214
|
+
# Hash values cannot be compared
|
215
|
+
nil
|
216
|
+
end
|
217
|
+
|
218
|
+
def max_by (&object)
|
219
|
+
value.max_by do |obj|
|
220
|
+
result = yield obj
|
221
|
+
return result if env::break?
|
222
|
+
result
|
223
|
+
end
|
224
|
+
rescue ArgumentError
|
225
|
+
# Hash values cannot be compared
|
226
|
+
nil
|
227
|
+
end
|
228
|
+
|
229
|
+
def merge (hash)
|
230
|
+
value.merge(hash)
|
231
|
+
end
|
232
|
+
|
233
|
+
def merge! (hash)
|
234
|
+
value.merge!(hash)
|
235
|
+
end
|
236
|
+
|
237
|
+
def min
|
238
|
+
value.min
|
239
|
+
rescue ArgumentError
|
240
|
+
# Hash values cannot be compared
|
241
|
+
nil
|
242
|
+
end
|
243
|
+
|
244
|
+
def min_by (&object)
|
245
|
+
value.min_by do |obj|
|
246
|
+
result = yield obj
|
247
|
+
return result if env::break?
|
248
|
+
result
|
249
|
+
end
|
250
|
+
rescue ArgumentError
|
251
|
+
# Hash values cannot be compared
|
252
|
+
nil
|
253
|
+
end
|
254
|
+
|
255
|
+
def minmax
|
256
|
+
value.minmax
|
257
|
+
rescue ArgumentError
|
258
|
+
# Hash values cannot be compared
|
259
|
+
nil
|
260
|
+
end
|
261
|
+
|
262
|
+
def minmax_by (&object)
|
263
|
+
value.minmax_by do |obj|
|
264
|
+
result = yield obj
|
265
|
+
return result if env::break?
|
266
|
+
result
|
267
|
+
end
|
268
|
+
rescue ArgumentError
|
269
|
+
# Hash values cannot be compared
|
270
|
+
nil
|
271
|
+
end
|
272
|
+
|
273
|
+
def partition (&block)
|
274
|
+
value.partition do |obj|
|
275
|
+
result = yield obj
|
276
|
+
return result if env::break?
|
277
|
+
result
|
278
|
+
end
|
279
|
+
end
|
280
|
+
|
281
|
+
def reject (&block)
|
282
|
+
value.reject do |obj|
|
283
|
+
result = yield obj
|
284
|
+
break result if env::break?
|
285
|
+
result
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
289
|
+
def reject! (&block)
|
290
|
+
value.reject! do |obj|
|
291
|
+
result = yield obj
|
292
|
+
break result if env::break?
|
293
|
+
result
|
294
|
+
end
|
295
|
+
end
|
296
|
+
|
297
|
+
def replace (hash)
|
298
|
+
value.replace(hash)
|
299
|
+
end
|
300
|
+
|
301
|
+
def select (&block)
|
302
|
+
value.select do |obj|
|
303
|
+
result = yield obj
|
304
|
+
break result if env::break?
|
305
|
+
result
|
306
|
+
end
|
307
|
+
end
|
308
|
+
|
309
|
+
def select! (&block)
|
310
|
+
value.select! do |obj|
|
311
|
+
result = yield obj
|
312
|
+
break result if env::break?
|
313
|
+
result
|
314
|
+
end
|
315
|
+
end
|
316
|
+
|
317
|
+
def set (object_1, object_2)
|
318
|
+
unless value.length >= env::max_hash_length && !value.has_key?(object_1)
|
319
|
+
value[object_1] = object_2
|
320
|
+
end
|
321
|
+
end
|
322
|
+
|
323
|
+
def shift
|
324
|
+
value.shift
|
325
|
+
end
|
326
|
+
|
327
|
+
def take (number)
|
328
|
+
return value.dup if number < 0
|
329
|
+
value.take(number)
|
330
|
+
end
|
331
|
+
|
332
|
+
def take_while (&block)
|
333
|
+
value.take_while do |obj|
|
334
|
+
result = yield obj
|
335
|
+
break result if env::break?
|
336
|
+
result
|
337
|
+
end
|
338
|
+
end
|
339
|
+
|
340
|
+
def value? (object)
|
341
|
+
value.has_value?(object)
|
342
|
+
end
|
343
|
+
|
344
|
+
def values
|
345
|
+
value.values
|
346
|
+
end
|
347
|
+
|
348
|
+
def values_at (*every_object)
|
349
|
+
value.values_at(*every_object)
|
350
|
+
end
|
351
|
+
end
|