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,345 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
#
|
3
|
+
# Copyright © 2010-2011 Jesse Sielaff
|
4
|
+
#
|
5
|
+
|
6
|
+
class QImplicit < Q_Object
|
7
|
+
def all? (&block)
|
8
|
+
value.all? do |obj|
|
9
|
+
result = yield obj
|
10
|
+
break result if env::break?
|
11
|
+
result
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def any? (&block)
|
16
|
+
value.any? do |obj|
|
17
|
+
result = yield obj
|
18
|
+
break result if env::break?
|
19
|
+
result
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def array
|
24
|
+
[]
|
25
|
+
end
|
26
|
+
|
27
|
+
def arrays (*every_array)
|
28
|
+
every_array
|
29
|
+
end
|
30
|
+
|
31
|
+
def block (&block)
|
32
|
+
block
|
33
|
+
end
|
34
|
+
|
35
|
+
def blocks (*every_block)
|
36
|
+
every_block
|
37
|
+
end
|
38
|
+
|
39
|
+
def break_if (&block)
|
40
|
+
if result = yield
|
41
|
+
env::break!
|
42
|
+
return nil
|
43
|
+
end
|
44
|
+
|
45
|
+
result
|
46
|
+
end
|
47
|
+
|
48
|
+
def break_unless (&block)
|
49
|
+
unless result = yield
|
50
|
+
env::break!
|
51
|
+
return nil
|
52
|
+
end
|
53
|
+
|
54
|
+
result
|
55
|
+
end
|
56
|
+
|
57
|
+
def class
|
58
|
+
klass = Class.new
|
59
|
+
klass.send(:define_method, :to_q) { QDynamic.new(self) }
|
60
|
+
klass
|
61
|
+
end
|
62
|
+
|
63
|
+
def classes (*every_class)
|
64
|
+
every_class
|
65
|
+
end
|
66
|
+
|
67
|
+
def compact
|
68
|
+
value.compact
|
69
|
+
end
|
70
|
+
|
71
|
+
def compact!
|
72
|
+
value.compact!
|
73
|
+
value.dup
|
74
|
+
end
|
75
|
+
|
76
|
+
def count (object)
|
77
|
+
value.count(object)
|
78
|
+
end
|
79
|
+
|
80
|
+
def count_by (&block)
|
81
|
+
value.count do |obj|
|
82
|
+
result = yield obj
|
83
|
+
break result if env::break?
|
84
|
+
result
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def def (token, &block)
|
89
|
+
env_object = env::object
|
90
|
+
env = self.env::replicate
|
91
|
+
|
92
|
+
env_object.define_singleton_method(:"__Q_#{token}__") do |object = nil|
|
93
|
+
env::frame(self) { block.call(object, env) }
|
94
|
+
end
|
95
|
+
|
96
|
+
env = self.env::replicate
|
97
|
+
env.max_nodes = self.env.max_method_nodes
|
98
|
+
|
99
|
+
env_object.define_singleton_method(token) do |object = nil|
|
100
|
+
begin
|
101
|
+
env::frame(self) { block.call(object, env) }
|
102
|
+
rescue Q_Environment::TooManyNodes
|
103
|
+
nil
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
env_object
|
108
|
+
end
|
109
|
+
|
110
|
+
def e
|
111
|
+
Number.e
|
112
|
+
end
|
113
|
+
|
114
|
+
def each (&block)
|
115
|
+
value.dup.each do |obj|
|
116
|
+
result = yield obj
|
117
|
+
break result if env::break?
|
118
|
+
result
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def elect (*every_object, object)
|
123
|
+
object
|
124
|
+
end
|
125
|
+
|
126
|
+
def false
|
127
|
+
false
|
128
|
+
end
|
129
|
+
|
130
|
+
def falses (*every_false)
|
131
|
+
every_false
|
132
|
+
end
|
133
|
+
|
134
|
+
def hash
|
135
|
+
{}
|
136
|
+
end
|
137
|
+
|
138
|
+
def hashes (*every_hash)
|
139
|
+
every_hash
|
140
|
+
end
|
141
|
+
|
142
|
+
def i
|
143
|
+
Number.i
|
144
|
+
end
|
145
|
+
|
146
|
+
def jump_if (&block)
|
147
|
+
if result = yield
|
148
|
+
env::jump!
|
149
|
+
return nil
|
150
|
+
end
|
151
|
+
|
152
|
+
result
|
153
|
+
end
|
154
|
+
|
155
|
+
def jump_unless (&block)
|
156
|
+
unless result = yield
|
157
|
+
env::jump!
|
158
|
+
return nil
|
159
|
+
end
|
160
|
+
|
161
|
+
result
|
162
|
+
end
|
163
|
+
|
164
|
+
def loop (&block)
|
165
|
+
begin
|
166
|
+
result = yield
|
167
|
+
return result if env::break?
|
168
|
+
end while true
|
169
|
+
end
|
170
|
+
|
171
|
+
def map (&block)
|
172
|
+
value.collect do |obj|
|
173
|
+
result = yield obj
|
174
|
+
return result if env::break?
|
175
|
+
result
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
def many? (&block)
|
180
|
+
value.count do |obj|
|
181
|
+
result = yield obj
|
182
|
+
return result if env::break?
|
183
|
+
result
|
184
|
+
end > 2
|
185
|
+
end
|
186
|
+
|
187
|
+
def module
|
188
|
+
Module.new
|
189
|
+
end
|
190
|
+
|
191
|
+
def modules (*every_module)
|
192
|
+
every_module
|
193
|
+
end
|
194
|
+
|
195
|
+
def nan
|
196
|
+
Number.nan
|
197
|
+
end
|
198
|
+
|
199
|
+
def neg_inf
|
200
|
+
Number.neg_inf
|
201
|
+
end
|
202
|
+
|
203
|
+
def neg_one
|
204
|
+
-1
|
205
|
+
end
|
206
|
+
|
207
|
+
def new
|
208
|
+
klass = Class.new
|
209
|
+
klass.send(:define_method, :to_q) { QDynamic.new(self) }
|
210
|
+
klass.new
|
211
|
+
end
|
212
|
+
|
213
|
+
def newline
|
214
|
+
?\n
|
215
|
+
end
|
216
|
+
|
217
|
+
def nil
|
218
|
+
nil
|
219
|
+
end
|
220
|
+
|
221
|
+
def nils (*every_nil)
|
222
|
+
every_nil
|
223
|
+
end
|
224
|
+
|
225
|
+
def none? (&block)
|
226
|
+
value.none? do |obj|
|
227
|
+
result = yield obj
|
228
|
+
break result if env::break?
|
229
|
+
result
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
233
|
+
def now
|
234
|
+
Time.now
|
235
|
+
end
|
236
|
+
|
237
|
+
def numbers (*every_number)
|
238
|
+
every_number
|
239
|
+
end
|
240
|
+
|
241
|
+
def objects (*every_object)
|
242
|
+
every_object
|
243
|
+
end
|
244
|
+
|
245
|
+
def one
|
246
|
+
1
|
247
|
+
end
|
248
|
+
|
249
|
+
def one? (&block)
|
250
|
+
value.one? do |obj|
|
251
|
+
result = yield obj
|
252
|
+
break result if env::break?
|
253
|
+
result
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
257
|
+
def pi
|
258
|
+
Number.pi
|
259
|
+
end
|
260
|
+
|
261
|
+
def pos_inf
|
262
|
+
Number.pos_inf
|
263
|
+
end
|
264
|
+
|
265
|
+
def self
|
266
|
+
env::self
|
267
|
+
end
|
268
|
+
|
269
|
+
def skip_a (object_1, object_2)
|
270
|
+
object_2
|
271
|
+
end
|
272
|
+
|
273
|
+
def skip_b (object_1, object_2)
|
274
|
+
object_1
|
275
|
+
end
|
276
|
+
|
277
|
+
def space
|
278
|
+
' '
|
279
|
+
end
|
280
|
+
|
281
|
+
def string
|
282
|
+
''
|
283
|
+
end
|
284
|
+
|
285
|
+
def strings (*every_string)
|
286
|
+
every_string
|
287
|
+
end
|
288
|
+
|
289
|
+
def tab
|
290
|
+
?\t
|
291
|
+
end
|
292
|
+
|
293
|
+
def three
|
294
|
+
3
|
295
|
+
end
|
296
|
+
|
297
|
+
def times (*every_time)
|
298
|
+
every_time
|
299
|
+
end
|
300
|
+
|
301
|
+
def tokens (*every_token)
|
302
|
+
every_token
|
303
|
+
end
|
304
|
+
|
305
|
+
def true
|
306
|
+
true
|
307
|
+
end
|
308
|
+
|
309
|
+
def trues (*every_true)
|
310
|
+
every_true
|
311
|
+
end
|
312
|
+
|
313
|
+
def two
|
314
|
+
2
|
315
|
+
end
|
316
|
+
|
317
|
+
def uniq
|
318
|
+
value.uniq
|
319
|
+
end
|
320
|
+
|
321
|
+
def uniq!
|
322
|
+
value.uniq!
|
323
|
+
value.dup
|
324
|
+
end
|
325
|
+
|
326
|
+
def unset
|
327
|
+
env::unset(env::last_assigned_variable)
|
328
|
+
end
|
329
|
+
|
330
|
+
def until (&block)
|
331
|
+
until result = yield
|
332
|
+
return result if env::break?
|
333
|
+
end
|
334
|
+
end
|
335
|
+
|
336
|
+
def while (&block)
|
337
|
+
while result = yield
|
338
|
+
return result if env::break?
|
339
|
+
end
|
340
|
+
end
|
341
|
+
|
342
|
+
def zero
|
343
|
+
0
|
344
|
+
end
|
345
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
#
|
3
|
+
# Copyright © 2010-2011 Jesse Sielaff
|
4
|
+
#
|
5
|
+
|
6
|
+
class QModule < QObject
|
7
|
+
def def (token, &block)
|
8
|
+
env = self.env::replicate
|
9
|
+
|
10
|
+
value.send(:define_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.send(:define_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 include (module_1)
|
29
|
+
value.send(:include, module_1) if module_1.instance_of?(Module)
|
30
|
+
value
|
31
|
+
rescue ArgumentError
|
32
|
+
# Cyclic include
|
33
|
+
value
|
34
|
+
end
|
35
|
+
|
36
|
+
def module?
|
37
|
+
value
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
#
|
3
|
+
# Copyright © 2010-2011 Jesse Sielaff
|
4
|
+
#
|
5
|
+
|
6
|
+
class QNil < QObject
|
7
|
+
def and (object)
|
8
|
+
nil
|
9
|
+
end
|
10
|
+
|
11
|
+
def choose (object_1, object_2)
|
12
|
+
object_2
|
13
|
+
end
|
14
|
+
|
15
|
+
def if (&block)
|
16
|
+
nil
|
17
|
+
end
|
18
|
+
|
19
|
+
def nil?
|
20
|
+
true
|
21
|
+
end
|
22
|
+
|
23
|
+
def not
|
24
|
+
true
|
25
|
+
end
|
26
|
+
|
27
|
+
def or (object)
|
28
|
+
object
|
29
|
+
end
|
30
|
+
|
31
|
+
def stringify
|
32
|
+
"nil"
|
33
|
+
end
|
34
|
+
|
35
|
+
def tally
|
36
|
+
0
|
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,118 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
#
|
3
|
+
# Copyright © 2010-2011 Jesse Sielaff
|
4
|
+
#
|
5
|
+
|
6
|
+
class QNumber < QObject
|
7
|
+
def QNumber.from_s (string)
|
8
|
+
Number(string)
|
9
|
+
end
|
10
|
+
|
11
|
+
def abs
|
12
|
+
value.abs
|
13
|
+
end
|
14
|
+
|
15
|
+
def add (number)
|
16
|
+
value + number
|
17
|
+
end
|
18
|
+
|
19
|
+
def area
|
20
|
+
value.area
|
21
|
+
end
|
22
|
+
|
23
|
+
def ceil
|
24
|
+
value.ceil
|
25
|
+
end
|
26
|
+
|
27
|
+
def complex?
|
28
|
+
value.complex?
|
29
|
+
end
|
30
|
+
|
31
|
+
def conjugate
|
32
|
+
value.conjugate
|
33
|
+
end
|
34
|
+
|
35
|
+
def cos
|
36
|
+
# value.cos
|
37
|
+
end
|
38
|
+
|
39
|
+
def diagonal
|
40
|
+
value.diagonal
|
41
|
+
end
|
42
|
+
|
43
|
+
def divide (number)
|
44
|
+
value / number
|
45
|
+
end
|
46
|
+
|
47
|
+
def exp
|
48
|
+
# value.exp
|
49
|
+
end
|
50
|
+
|
51
|
+
def floor
|
52
|
+
value.floor
|
53
|
+
end
|
54
|
+
|
55
|
+
def imag
|
56
|
+
value.imag
|
57
|
+
end
|
58
|
+
|
59
|
+
def join (number)
|
60
|
+
# value.join(number)
|
61
|
+
end
|
62
|
+
|
63
|
+
def log
|
64
|
+
# value.log
|
65
|
+
end
|
66
|
+
|
67
|
+
def modulo (number)
|
68
|
+
# value.modulo(number)
|
69
|
+
end
|
70
|
+
|
71
|
+
def multiply (number)
|
72
|
+
value * number
|
73
|
+
end
|
74
|
+
|
75
|
+
def negate
|
76
|
+
-value
|
77
|
+
end
|
78
|
+
|
79
|
+
def nominal
|
80
|
+
value.nominal
|
81
|
+
end
|
82
|
+
|
83
|
+
def number?
|
84
|
+
value
|
85
|
+
end
|
86
|
+
|
87
|
+
def real
|
88
|
+
value.real
|
89
|
+
end
|
90
|
+
|
91
|
+
def real?
|
92
|
+
value.real?
|
93
|
+
end
|
94
|
+
|
95
|
+
def reflect
|
96
|
+
value.reflect
|
97
|
+
end
|
98
|
+
|
99
|
+
def round
|
100
|
+
value.round
|
101
|
+
end
|
102
|
+
|
103
|
+
def sin
|
104
|
+
# value.sin
|
105
|
+
end
|
106
|
+
|
107
|
+
def sqrt
|
108
|
+
value.sqrt
|
109
|
+
end
|
110
|
+
|
111
|
+
def square
|
112
|
+
# value.square
|
113
|
+
end
|
114
|
+
|
115
|
+
def subtract (number)
|
116
|
+
value - number
|
117
|
+
end
|
118
|
+
end
|