code-ruby 0.13.1 → 0.14.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/dependabot.yml +15 -0
- data/.github/workflows/ci.yml +31 -0
- data/.rubocop.yml +8 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +52 -4
- data/bin/bundle-audit +31 -0
- data/bin/bundler-audit +31 -0
- data/bin/console +1 -0
- data/bin/rspec +31 -0
- data/bin/rubocop +31 -0
- data/lib/code/error.rb +0 -3
- data/lib/code/node/base_10.rb +4 -3
- data/lib/code/node/base_16.rb +1 -0
- data/lib/code/node/base_2.rb +1 -0
- data/lib/code/node/base_8.rb +1 -0
- data/lib/code/node/boolean.rb +1 -0
- data/lib/code/node/call.rb +14 -15
- data/lib/code/node/call_argument.rb +4 -4
- data/lib/code/node/code.rb +1 -0
- data/lib/code/node/decimal.rb +4 -3
- data/lib/code/node/dictionary.rb +5 -3
- data/lib/code/node/function.rb +1 -0
- data/lib/code/node/function_parameter.rb +14 -0
- data/lib/code/node/if.rb +6 -4
- data/lib/code/node/left_operation.rb +3 -3
- data/lib/code/node/list.rb +1 -0
- data/lib/code/node/negation.rb +1 -0
- data/lib/code/node/not.rb +1 -0
- data/lib/code/node/nothing.rb +1 -0
- data/lib/code/node/right_operation.rb +3 -2
- data/lib/code/node/splat.rb +1 -0
- data/lib/code/node/square_bracket.rb +1 -0
- data/lib/code/node/string.rb +3 -0
- data/lib/code/node/ternary.rb +4 -3
- data/lib/code/node/unary_minus.rb +1 -0
- data/lib/code/node/while.rb +4 -3
- data/lib/code/object/boolean.rb +2 -2
- data/lib/code/object/context.rb +1 -1
- data/lib/code/object/decimal.rb +9 -21
- data/lib/code/object/dictionary.rb +80 -113
- data/lib/code/object/function.rb +25 -35
- data/lib/code/object/global.rb +33 -32
- data/lib/code/object/identifier_list.rb +4 -4
- data/lib/code/object/integer.rb +14 -23
- data/lib/code/object/json.rb +10 -2
- data/lib/code/object/list.rb +50 -23
- data/lib/code/object/parameter.rb +18 -10
- data/lib/code/object/range.rb +33 -10
- data/lib/code/object/string.rb +2 -2
- data/lib/code/object/time.rb +4 -4
- data/lib/code/object.rb +31 -50
- data/lib/code/parser/string.rb +1 -1
- data/lib/code/type/repeat.rb +1 -1
- data/lib/code/type/sig.rb +1 -3
- data/lib/code/version.rb +1 -1
- data/lib/code-ruby.rb +2 -7
- data/lib/code.rb +1 -3
- data/spec/code/object/dictionary_spec.rb +6 -6
- data/spec/code_spec.rb +7 -8
- data/yarn.lock +4 -0
- metadata +10 -3
- data/lib/code/object/argument.rb +0 -27
@@ -7,6 +7,7 @@ class Code
|
|
7
7
|
|
8
8
|
def initialize(parsed)
|
9
9
|
return if parsed.blank?
|
10
|
+
|
10
11
|
@left = Statement.new(parsed.delete(:left).presence)
|
11
12
|
@operator = parsed.delete(:operator).presence
|
12
13
|
@right = Statement.new(parsed.delete(:right).presence)
|
@@ -54,7 +55,7 @@ class Code
|
|
54
55
|
|
55
56
|
left.call(
|
56
57
|
operator: @operator,
|
57
|
-
arguments:
|
58
|
+
arguments: Object::List.new([right]),
|
58
59
|
**args
|
59
60
|
)
|
60
61
|
else
|
@@ -63,7 +64,7 @@ class Code
|
|
63
64
|
|
64
65
|
left.call(
|
65
66
|
operator: @operator,
|
66
|
-
arguments:
|
67
|
+
arguments: Object::List.new([right]),
|
67
68
|
**args
|
68
69
|
)
|
69
70
|
end
|
data/lib/code/node/splat.rb
CHANGED
@@ -5,6 +5,7 @@ class Code
|
|
5
5
|
class SquareBracket < Node
|
6
6
|
def initialize(parsed)
|
7
7
|
return if parsed.blank?
|
8
|
+
|
8
9
|
@left = Node::Statement.new(parsed.delete(:left).presence)
|
9
10
|
@statements = parsed.delete(:statements).presence || []
|
10
11
|
@statements.map! { |statement| Node::Statement.new(statement) }
|
data/lib/code/node/string.rb
CHANGED
@@ -7,6 +7,7 @@ class Code
|
|
7
7
|
class Code < Node
|
8
8
|
def initialize(parsed)
|
9
9
|
return if parsed.blank?
|
10
|
+
|
10
11
|
@code = Node::Code.new(parsed.presence)
|
11
12
|
end
|
12
13
|
|
@@ -18,6 +19,7 @@ class Code
|
|
18
19
|
class Text < Node
|
19
20
|
def initialize(parsed)
|
20
21
|
return if parsed.blank?
|
22
|
+
|
21
23
|
@text = parsed
|
22
24
|
end
|
23
25
|
|
@@ -53,6 +55,7 @@ class Code
|
|
53
55
|
|
54
56
|
def initialize(parsed)
|
55
57
|
return if parsed.blank?
|
58
|
+
|
56
59
|
@parts =
|
57
60
|
(parsed.presence || []).map { |part| Node::String::Part.new(part) }
|
58
61
|
end
|
data/lib/code/node/ternary.rb
CHANGED
@@ -5,11 +5,12 @@ class Code
|
|
5
5
|
class Ternary < Node
|
6
6
|
def initialize(parsed)
|
7
7
|
return if parsed.blank?
|
8
|
+
|
8
9
|
@left = Node::Statement.new(parsed.delete(:left).presence)
|
9
10
|
@middle = Node::Statement.new(parsed.delete(:middle).presence)
|
10
|
-
|
11
|
-
|
12
|
-
|
11
|
+
return unless parsed.key?(:right)
|
12
|
+
|
13
|
+
@right = Node::Statement.new(parsed.delete(:right).presence)
|
13
14
|
end
|
14
15
|
|
15
16
|
def evaluate(**args)
|
data/lib/code/node/while.rb
CHANGED
@@ -9,10 +9,11 @@ class Code
|
|
9
9
|
|
10
10
|
def initialize(parsed)
|
11
11
|
return if parsed.blank?
|
12
|
+
|
12
13
|
@operator = parsed.delete(:operator).presence
|
13
|
-
if parsed.key?(
|
14
|
-
|
15
|
-
|
14
|
+
@statement = Statement.new(parsed.delete(:statement)) if parsed.key?(
|
15
|
+
:statement
|
16
|
+
)
|
16
17
|
@body = Code.new(parsed.delete(:body).presence)
|
17
18
|
end
|
18
19
|
|
data/lib/code/object/boolean.rb
CHANGED
@@ -11,8 +11,8 @@ class Code
|
|
11
11
|
|
12
12
|
def call(**args)
|
13
13
|
operator = args.fetch(:operator, nil)
|
14
|
-
arguments = args.fetch(:arguments,
|
15
|
-
value = arguments.
|
14
|
+
arguments = args.fetch(:arguments, List.new)
|
15
|
+
value = arguments.code_first
|
16
16
|
|
17
17
|
case operator.to_s
|
18
18
|
when "&", "bitwise_and"
|
data/lib/code/object/context.rb
CHANGED
data/lib/code/object/decimal.rb
CHANGED
@@ -9,14 +9,14 @@ class Code
|
|
9
9
|
decimal = decimal.raw if decimal.is_an?(Object)
|
10
10
|
exponent = exponent.raw if exponent.is_an?(Object)
|
11
11
|
@raw = decimal.to_d * 10**exponent.to_d
|
12
|
-
rescue FloatDomainError
|
12
|
+
rescue FloatDomainError
|
13
13
|
raise Error, "#{decimal.inspect} * 10**#{exponent.inspect} is invalid"
|
14
14
|
end
|
15
15
|
|
16
16
|
def call(**args)
|
17
17
|
operator = args.fetch(:operator, nil)
|
18
|
-
arguments = args.fetch(:arguments,
|
19
|
-
value = arguments.
|
18
|
+
arguments = args.fetch(:arguments, List.new)
|
19
|
+
value = arguments.code_first
|
20
20
|
|
21
21
|
case operator.to_s
|
22
22
|
when "%", "modulo"
|
@@ -33,10 +33,10 @@ class Code
|
|
33
33
|
code_power(value)
|
34
34
|
when "+", "plus"
|
35
35
|
sig(args) { Object.maybe }
|
36
|
-
|
36
|
+
arguments.any? ? code_plus(value) : self
|
37
37
|
when "-", "minus"
|
38
38
|
sig(args) { (Integer | Decimal).maybe }
|
39
|
-
|
39
|
+
arguments.any? ? code_minus(value) : code_unary_minus
|
40
40
|
when "/", "division"
|
41
41
|
sig(args) { Integer | Decimal }
|
42
42
|
code_division(value)
|
@@ -152,7 +152,7 @@ class Code
|
|
152
152
|
end
|
153
153
|
|
154
154
|
def code_ceil(n = nil)
|
155
|
-
n
|
155
|
+
n = Integer.new(0) if n.nil? || n.is_a?(Nothing)
|
156
156
|
Decimal.new(raw.ceil(n.raw))
|
157
157
|
end
|
158
158
|
|
@@ -177,7 +177,7 @@ class Code
|
|
177
177
|
end
|
178
178
|
|
179
179
|
def code_floor(n = nil)
|
180
|
-
n
|
180
|
+
n = Integer.new(0) if n.nil? || n.is_a?(Nothing)
|
181
181
|
Decimal.new(raw.floor(n.raw))
|
182
182
|
end
|
183
183
|
|
@@ -234,7 +234,7 @@ class Code
|
|
234
234
|
end
|
235
235
|
|
236
236
|
def code_round(n = nil)
|
237
|
-
n
|
237
|
+
n = Integer.new(0) if n.nil? || n.is_a?(Nothing)
|
238
238
|
Decimal.new(raw.round(n.raw))
|
239
239
|
end
|
240
240
|
|
@@ -279,7 +279,7 @@ class Code
|
|
279
279
|
end
|
280
280
|
|
281
281
|
def code_truncate(n = nil)
|
282
|
-
n
|
282
|
+
n = Integer.new(0) if n.nil? || n.is_a?(Nothing)
|
283
283
|
Decimal.new(raw.truncate(n.raw))
|
284
284
|
end
|
285
285
|
|
@@ -294,18 +294,6 @@ class Code
|
|
294
294
|
def code_zero?
|
295
295
|
Boolean.new(raw.zero?)
|
296
296
|
end
|
297
|
-
|
298
|
-
def whole?
|
299
|
-
whole == raw
|
300
|
-
end
|
301
|
-
|
302
|
-
def whole
|
303
|
-
raw.round
|
304
|
-
end
|
305
|
-
|
306
|
-
def as_json(...)
|
307
|
-
whole? ? whole.as_json(...) : super
|
308
|
-
end
|
309
297
|
end
|
310
298
|
end
|
311
299
|
end
|
@@ -3,19 +3,15 @@
|
|
3
3
|
class Code
|
4
4
|
class Object
|
5
5
|
class Dictionary < ::Code::Object
|
6
|
-
def initialize(*args, **
|
7
|
-
@raw =
|
8
|
-
.as_json
|
9
|
-
.to_h
|
10
|
-
.transform_keys { |key| Json.to_code(key) }
|
11
|
-
.transform_values { |value| Json.to_code(value) }
|
6
|
+
def initialize(*args, **kargs, &_block)
|
7
|
+
@raw = args.map(&:to_h).reduce({}, &:merge).merge(kargs)
|
12
8
|
end
|
13
9
|
|
14
10
|
def call(**args)
|
15
11
|
operator = args.fetch(:operator, nil)
|
16
|
-
arguments = args.fetch(:arguments,
|
12
|
+
arguments = args.fetch(:arguments, List.new)
|
17
13
|
globals = multi_fetch(args, *GLOBALS)
|
18
|
-
value = arguments.
|
14
|
+
value = arguments.code_first
|
19
15
|
|
20
16
|
case operator.to_s
|
21
17
|
when "<", "inferior"
|
@@ -50,7 +46,7 @@ class Code
|
|
50
46
|
code_compact
|
51
47
|
when "delete"
|
52
48
|
sig(args) { Object.repeat(1) }
|
53
|
-
code_delete(*arguments.
|
49
|
+
code_delete(*arguments.raw, **globals)
|
54
50
|
when "delete_if"
|
55
51
|
sig(args) { Function | Class }
|
56
52
|
code_delete_if(value, **globals)
|
@@ -59,7 +55,7 @@ class Code
|
|
59
55
|
code_delete_unless(value, **globals)
|
60
56
|
when "dig"
|
61
57
|
sig(args) { Object.repeat(1) }
|
62
|
-
code_dig(*arguments.
|
58
|
+
code_dig(*arguments.raw)
|
63
59
|
when "each"
|
64
60
|
sig(args) { Function }
|
65
61
|
code_each(value, **globals)
|
@@ -71,13 +67,13 @@ class Code
|
|
71
67
|
code_empty?
|
72
68
|
when "except"
|
73
69
|
sig(args) { Object.repeat(1) }
|
74
|
-
code_except(*arguments.
|
70
|
+
code_except(*arguments.raw)
|
75
71
|
when "fetch"
|
76
72
|
sig(args) { Object.repeat(1) }
|
77
|
-
code_fetch(*arguments.
|
73
|
+
code_fetch(*arguments.raw, **globals)
|
78
74
|
when "fetch_values"
|
79
75
|
sig(args) { Object.repeat(1) }
|
80
|
-
code_fetch_values(*arguments.
|
76
|
+
code_fetch_values(*arguments.raw)
|
81
77
|
when "five?"
|
82
78
|
sig(args)
|
83
79
|
code_five?
|
@@ -104,13 +100,16 @@ class Code
|
|
104
100
|
code_keep_unless(value, **globals)
|
105
101
|
when "key"
|
106
102
|
sig(args) { [Object, Function.maybe] }
|
107
|
-
code_key(*arguments.
|
103
|
+
code_key(*arguments.raw, **globals)
|
108
104
|
when "keys"
|
109
105
|
sig(args)
|
110
106
|
code_keys
|
111
107
|
when "merge"
|
112
108
|
sig(args) { [Dictionary.repeat, Function.maybe] }
|
113
|
-
code_merge(*arguments.
|
109
|
+
code_merge(*arguments.raw, **globals)
|
110
|
+
when "merge!"
|
111
|
+
sig(args) { [Dictionary.repeat, Function.maybe] }
|
112
|
+
code_merge!(*arguments.raw, **globals)
|
114
113
|
when "nine?"
|
115
114
|
sig(args)
|
116
115
|
code_nine?
|
@@ -177,12 +176,7 @@ class Code
|
|
177
176
|
raw.any? do |key, value|
|
178
177
|
argument
|
179
178
|
.call(
|
180
|
-
arguments: [
|
181
|
-
Argument.new(key),
|
182
|
-
Argument.new(value),
|
183
|
-
Argument.new(self),
|
184
|
-
Argument.new(Integer.new(index))
|
185
|
-
],
|
179
|
+
arguments: List.new([key, value, self, Integer.new(index)]),
|
186
180
|
**globals
|
187
181
|
)
|
188
182
|
.truthy?
|
@@ -219,22 +213,16 @@ class Code
|
|
219
213
|
)
|
220
214
|
|
221
215
|
arguments = arguments[..-2] if default
|
216
|
+
first = arguments.first
|
222
217
|
|
223
218
|
if arguments.one?
|
224
|
-
raw.delete(
|
219
|
+
raw.delete(first) do
|
225
220
|
if default
|
226
|
-
default.call(
|
227
|
-
arguments: [
|
228
|
-
Argument.new(arguments.first),
|
229
|
-
Argument.new(self),
|
230
|
-
Argument.new(index)
|
231
|
-
],
|
232
|
-
**globals
|
233
|
-
)
|
221
|
+
default.call(arguments: List.new([first, self, index]), **globals)
|
234
222
|
else
|
235
223
|
raise(
|
236
224
|
Code::Error::KeyNotFound,
|
237
|
-
"#{
|
225
|
+
"#{first.inspect} not found on #{inspect}"
|
238
226
|
)
|
239
227
|
end
|
240
228
|
end
|
@@ -271,12 +259,7 @@ class Code
|
|
271
259
|
else
|
272
260
|
raw.delete_if.with_index do |(key, value), index|
|
273
261
|
argument.call(
|
274
|
-
arguments: [
|
275
|
-
Argument.new(key),
|
276
|
-
Argument.new(value),
|
277
|
-
Argument.new(self),
|
278
|
-
Argument.new(Integer.new(index))
|
279
|
-
],
|
262
|
+
arguments: List.new([key, value, self, Integer.new(index)]),
|
280
263
|
**globals
|
281
264
|
).truthy?
|
282
265
|
end
|
@@ -291,12 +274,7 @@ class Code
|
|
291
274
|
else
|
292
275
|
raw.delete_if.with_index do |(key, value), index|
|
293
276
|
argument.call(
|
294
|
-
arguments: [
|
295
|
-
Argument.new(key),
|
296
|
-
Argument.new(value),
|
297
|
-
Argument.new(self),
|
298
|
-
Argument.new(Integer.new(index))
|
299
|
-
],
|
277
|
+
arguments: List.new([key, value, self, Integer.new(index)]),
|
300
278
|
**globals
|
301
279
|
).falsy?
|
302
280
|
end
|
@@ -312,12 +290,7 @@ class Code
|
|
312
290
|
def code_each(argument, **globals)
|
313
291
|
raw.each.with_index do |(key, value), index|
|
314
292
|
argument.call(
|
315
|
-
arguments: [
|
316
|
-
Argument.new(key),
|
317
|
-
Argument.new(value),
|
318
|
-
Argument.new(self),
|
319
|
-
Argument.new(Integer.new(index))
|
320
|
-
],
|
293
|
+
arguments: List.new([key, value, self, Integer.new(index)]),
|
321
294
|
**globals
|
322
295
|
)
|
323
296
|
end
|
@@ -337,7 +310,7 @@ class Code
|
|
337
310
|
self.class.new(raw.except(*))
|
338
311
|
end
|
339
312
|
|
340
|
-
def code_fetch(*arguments, index:
|
313
|
+
def code_fetch(*arguments, index: 0, **globals)
|
341
314
|
default =
|
342
315
|
(
|
343
316
|
if arguments.last.is_a?(Function) && arguments.size > 1
|
@@ -346,45 +319,31 @@ class Code
|
|
346
319
|
)
|
347
320
|
|
348
321
|
arguments = arguments[..-2] if default
|
322
|
+
first = arguments.first || Nothing.new
|
349
323
|
|
350
324
|
if arguments.one?
|
351
|
-
raw.fetch(
|
325
|
+
raw.fetch(first) do
|
352
326
|
if default
|
353
327
|
default.call(
|
354
|
-
arguments: [
|
355
|
-
Argument.new(arguments.first),
|
356
|
-
Argument.new(self),
|
357
|
-
Argument.new(index)
|
358
|
-
],
|
328
|
+
arguments: List.new([first, Integer.new(index), self]),
|
359
329
|
**globals
|
360
330
|
)
|
361
331
|
else
|
362
332
|
raise(
|
363
|
-
|
364
|
-
"#{
|
333
|
+
Error::KeyNotFound,
|
334
|
+
"#{first.inspect} not found on #{inspect}"
|
365
335
|
)
|
366
336
|
end
|
367
337
|
end
|
368
338
|
else
|
369
|
-
|
339
|
+
Dictionary.new(
|
370
340
|
arguments
|
371
341
|
.map
|
372
342
|
.with_index do |argument, index|
|
373
343
|
if default
|
374
|
-
[
|
375
|
-
argument,
|
376
|
-
code_fetch(
|
377
|
-
argument,
|
378
|
-
default,
|
379
|
-
index: Integer.new(index),
|
380
|
-
**globals
|
381
|
-
)
|
382
|
-
]
|
344
|
+
[argument, code_fetch(argument, default, index:, **globals)]
|
383
345
|
else
|
384
|
-
[
|
385
|
-
argument,
|
386
|
-
code_fetch(argument, index: Integer.new(index), **globals)
|
387
|
-
]
|
346
|
+
[argument, code_fetch(argument, index:, **globals)]
|
388
347
|
end
|
389
348
|
end
|
390
349
|
.to_h
|
@@ -401,7 +360,7 @@ class Code
|
|
401
360
|
end
|
402
361
|
|
403
362
|
def code_flatten(level = nil)
|
404
|
-
level
|
363
|
+
level = Integer.new(-1) if level.nil? || level.falsy?
|
405
364
|
code_to_list.code_flatten(level)
|
406
365
|
end
|
407
366
|
|
@@ -439,12 +398,7 @@ class Code
|
|
439
398
|
else
|
440
399
|
raw.keep_if.with_index do |(key, value), index|
|
441
400
|
argument.call(
|
442
|
-
arguments: [
|
443
|
-
Argument.new(key),
|
444
|
-
Argument.new(value),
|
445
|
-
Argument.new(self),
|
446
|
-
Argument.new(Integer.new(index))
|
447
|
-
],
|
401
|
+
arguments: List.new([key, value, Integer.new(index), self]),
|
448
402
|
**globals
|
449
403
|
).truthy?
|
450
404
|
end
|
@@ -459,12 +413,7 @@ class Code
|
|
459
413
|
else
|
460
414
|
raw.keep_if.with_index do |(key, value), index|
|
461
415
|
argument.call(
|
462
|
-
arguments: [
|
463
|
-
Argument.new(key),
|
464
|
-
Argument.new(value),
|
465
|
-
Argument.new(self),
|
466
|
-
Argument.new(Integer.new(index))
|
467
|
-
],
|
416
|
+
arguments: List.new([key, value, Integer.new(index), self]),
|
468
417
|
**globals
|
469
418
|
).falsy?
|
470
419
|
rescue Error::Next => e
|
@@ -478,10 +427,7 @@ class Code
|
|
478
427
|
def code_key(value, function = nil, **globals)
|
479
428
|
if function
|
480
429
|
raw.key(value) ||
|
481
|
-
function.call(
|
482
|
-
arguments: [Argument.new(value), Argument.new(self)],
|
483
|
-
**globals
|
484
|
-
)
|
430
|
+
function.call(arguments: List.new([value, self]), **globals)
|
485
431
|
else
|
486
432
|
raw.key(value) || Nothing.new
|
487
433
|
end
|
@@ -510,13 +456,10 @@ class Code
|
|
510
456
|
if conflict
|
511
457
|
conflict
|
512
458
|
.call(
|
513
|
-
arguments:
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
Argument.new(self),
|
518
|
-
Argument.new(Integer.new(index))
|
519
|
-
],
|
459
|
+
arguments:
|
460
|
+
List.new(
|
461
|
+
[key, old_value, new_value, Integer.new(index), self]
|
462
|
+
),
|
520
463
|
**globals
|
521
464
|
)
|
522
465
|
.tap { index += 1 }
|
@@ -530,6 +473,40 @@ class Code
|
|
530
473
|
)
|
531
474
|
end
|
532
475
|
|
476
|
+
def code_merge!(*arguments, **globals)
|
477
|
+
conflict =
|
478
|
+
(
|
479
|
+
if arguments.last.is_a?(Function) && arguments.size > 1
|
480
|
+
arguments.last
|
481
|
+
end
|
482
|
+
)
|
483
|
+
|
484
|
+
arguments = arguments[..-2] if conflict
|
485
|
+
|
486
|
+
index = 0
|
487
|
+
|
488
|
+
raw.merge!(*arguments.map(&:raw)) do |key, old_value, new_value|
|
489
|
+
if conflict
|
490
|
+
conflict
|
491
|
+
.call(
|
492
|
+
arguments:
|
493
|
+
List.new(
|
494
|
+
[key, old_value, new_value, Integer.new(index), self]
|
495
|
+
),
|
496
|
+
**globals
|
497
|
+
)
|
498
|
+
.tap { index += 1 }
|
499
|
+
else
|
500
|
+
new_value.tap { index += 1 }
|
501
|
+
end
|
502
|
+
rescue Error::Next => e
|
503
|
+
index += 1
|
504
|
+
e.value || Nothing.new
|
505
|
+
end
|
506
|
+
|
507
|
+
self
|
508
|
+
end
|
509
|
+
|
533
510
|
def code_nine?
|
534
511
|
code_size.code_nine?
|
535
512
|
end
|
@@ -544,12 +521,7 @@ class Code
|
|
544
521
|
else
|
545
522
|
raw.select!.with_index do |(key, value), index|
|
546
523
|
argument.call(
|
547
|
-
arguments: [
|
548
|
-
Argument.new(key),
|
549
|
-
Argument.new(value),
|
550
|
-
Argument.new(self),
|
551
|
-
Argument.new(Integer.new(index))
|
552
|
-
],
|
524
|
+
arguments: List.new([key, value, Integer.new(index), self]),
|
553
525
|
**globals
|
554
526
|
).truthy?
|
555
527
|
rescue Error::Next => e
|
@@ -567,12 +539,7 @@ class Code
|
|
567
539
|
self.class.new(
|
568
540
|
raw.select.with_index do |(key, value), index|
|
569
541
|
argument.call(
|
570
|
-
arguments: [
|
571
|
-
Argument.new(key),
|
572
|
-
Argument.new(value),
|
573
|
-
Argument.new(self),
|
574
|
-
Argument.new(Integer.new(index))
|
575
|
-
],
|
542
|
+
arguments: List.new([key, value, Integer.new(index), self]),
|
576
543
|
**globals
|
577
544
|
).truthy?
|
578
545
|
rescue Error::Next => e
|
@@ -623,15 +590,15 @@ class Code
|
|
623
590
|
List.new(raw.to_a.map { |key_value| List.new(key_value) })
|
624
591
|
end
|
625
592
|
|
593
|
+
def to_h
|
594
|
+
raw
|
595
|
+
end
|
596
|
+
|
626
597
|
def code_transform_values(function, **globals)
|
627
598
|
self.class.new(
|
628
599
|
raw.transform_values.with_index do |value, index|
|
629
600
|
function.call(
|
630
|
-
arguments: [
|
631
|
-
Argument.new(value),
|
632
|
-
Argument.new(self),
|
633
|
-
Argument.new(Integer.new(index))
|
634
|
-
],
|
601
|
+
arguments: List.new([value, Integer.new(index), self]),
|
635
602
|
**globals
|
636
603
|
)
|
637
604
|
rescue Error::Next => e
|
data/lib/code/object/function.rb
CHANGED
@@ -14,13 +14,13 @@ class Code
|
|
14
14
|
|
15
15
|
def call(**args)
|
16
16
|
operator = args.fetch(:operator, nil)
|
17
|
-
arguments = args.fetch(:arguments,
|
17
|
+
arguments = args.fetch(:arguments, List.new)
|
18
18
|
globals = multi_fetch(args, *GLOBALS)
|
19
19
|
|
20
20
|
case operator.to_s
|
21
21
|
when "", "call"
|
22
22
|
sig(args) { signature_for_call }
|
23
|
-
code_call(*arguments, **globals)
|
23
|
+
code_call(*arguments.raw, **globals)
|
24
24
|
else
|
25
25
|
super
|
26
26
|
end
|
@@ -30,48 +30,38 @@ class Code
|
|
30
30
|
context = Context.new({}, globals[:context])
|
31
31
|
|
32
32
|
parameters.raw.each.with_index do |parameter, index|
|
33
|
-
|
34
|
-
|
35
|
-
parameter.code_name,
|
36
|
-
List.new(arguments.select(&:regular?).map(&:value))
|
37
|
-
)
|
38
|
-
elsif parameter.keyword_splat?
|
39
|
-
context.code_set(
|
40
|
-
parameter.code_name,
|
41
|
-
Dictionary.new(
|
42
|
-
arguments.select(&:keyword?).map(&:name_value).to_h
|
43
|
-
)
|
44
|
-
)
|
45
|
-
elsif parameter.keyword?
|
46
|
-
argument =
|
33
|
+
argument =
|
34
|
+
if parameter.keyword?
|
47
35
|
arguments
|
48
|
-
.detect
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
36
|
+
.detect do |dictionary|
|
37
|
+
dictionary.code_has_value?(parameter.code_name)
|
38
|
+
end
|
39
|
+
&.code_get(parameter.code_name)
|
40
|
+
else
|
41
|
+
arguments[index]
|
42
|
+
end
|
43
|
+
argument = parameter.evaluate(**globals) if argument.nil?
|
44
|
+
context.code_set(parameter.code_name, argument)
|
57
45
|
end
|
58
46
|
|
59
47
|
body.evaluate(**globals, context:)
|
60
48
|
end
|
61
49
|
|
62
50
|
def signature_for_call
|
63
|
-
parameters
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
signature
|
51
|
+
parameters
|
52
|
+
.raw
|
53
|
+
.inject([]) do |signature, parameter|
|
54
|
+
if parameter.keyword?
|
55
|
+
if signature.last.is_a?(::Hash)
|
56
|
+
signature.last.code_set(parameter.code_name, Object)
|
57
|
+
signature
|
58
|
+
else
|
59
|
+
signature + [{ parameter.code_name => Object }]
|
60
|
+
end
|
68
61
|
else
|
69
|
-
signature + [
|
62
|
+
signature + [Object]
|
70
63
|
end
|
71
|
-
|
72
|
-
signature + [Object]
|
73
|
-
end
|
74
|
-
end + [Object.repeat]
|
64
|
+
end + [Object.repeat]
|
75
65
|
end
|
76
66
|
end
|
77
67
|
end
|