code-ruby 0.13.1 → 0.14.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.
- 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 +51 -3
- 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 +43 -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 +5 -8
- data/yarn.lock +4 -0
- metadata +10 -3
- data/lib/code/object/argument.rb +0 -27
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,13 @@ 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)
|
114
110
|
when "nine?"
|
115
111
|
sig(args)
|
116
112
|
code_nine?
|
@@ -177,12 +173,7 @@ class Code
|
|
177
173
|
raw.any? do |key, value|
|
178
174
|
argument
|
179
175
|
.call(
|
180
|
-
arguments: [
|
181
|
-
Argument.new(key),
|
182
|
-
Argument.new(value),
|
183
|
-
Argument.new(self),
|
184
|
-
Argument.new(Integer.new(index))
|
185
|
-
],
|
176
|
+
arguments: List.new([key, value, self, Integer.new(index)]),
|
186
177
|
**globals
|
187
178
|
)
|
188
179
|
.truthy?
|
@@ -219,22 +210,16 @@ class Code
|
|
219
210
|
)
|
220
211
|
|
221
212
|
arguments = arguments[..-2] if default
|
213
|
+
first = arguments.first
|
222
214
|
|
223
215
|
if arguments.one?
|
224
|
-
raw.delete(
|
216
|
+
raw.delete(first) do
|
225
217
|
if default
|
226
|
-
default.call(
|
227
|
-
arguments: [
|
228
|
-
Argument.new(arguments.first),
|
229
|
-
Argument.new(self),
|
230
|
-
Argument.new(index)
|
231
|
-
],
|
232
|
-
**globals
|
233
|
-
)
|
218
|
+
default.call(arguments: List.new([first, self, index]), **globals)
|
234
219
|
else
|
235
220
|
raise(
|
236
221
|
Code::Error::KeyNotFound,
|
237
|
-
"#{
|
222
|
+
"#{first.inspect} not found on #{inspect}"
|
238
223
|
)
|
239
224
|
end
|
240
225
|
end
|
@@ -271,12 +256,7 @@ class Code
|
|
271
256
|
else
|
272
257
|
raw.delete_if.with_index do |(key, value), index|
|
273
258
|
argument.call(
|
274
|
-
arguments: [
|
275
|
-
Argument.new(key),
|
276
|
-
Argument.new(value),
|
277
|
-
Argument.new(self),
|
278
|
-
Argument.new(Integer.new(index))
|
279
|
-
],
|
259
|
+
arguments: List.new([key, value, self, Integer.new(index)]),
|
280
260
|
**globals
|
281
261
|
).truthy?
|
282
262
|
end
|
@@ -291,12 +271,7 @@ class Code
|
|
291
271
|
else
|
292
272
|
raw.delete_if.with_index do |(key, value), index|
|
293
273
|
argument.call(
|
294
|
-
arguments: [
|
295
|
-
Argument.new(key),
|
296
|
-
Argument.new(value),
|
297
|
-
Argument.new(self),
|
298
|
-
Argument.new(Integer.new(index))
|
299
|
-
],
|
274
|
+
arguments: List.new([key, value, self, Integer.new(index)]),
|
300
275
|
**globals
|
301
276
|
).falsy?
|
302
277
|
end
|
@@ -312,12 +287,7 @@ class Code
|
|
312
287
|
def code_each(argument, **globals)
|
313
288
|
raw.each.with_index do |(key, value), index|
|
314
289
|
argument.call(
|
315
|
-
arguments: [
|
316
|
-
Argument.new(key),
|
317
|
-
Argument.new(value),
|
318
|
-
Argument.new(self),
|
319
|
-
Argument.new(Integer.new(index))
|
320
|
-
],
|
290
|
+
arguments: List.new([key, value, self, Integer.new(index)]),
|
321
291
|
**globals
|
322
292
|
)
|
323
293
|
end
|
@@ -337,7 +307,7 @@ class Code
|
|
337
307
|
self.class.new(raw.except(*))
|
338
308
|
end
|
339
309
|
|
340
|
-
def code_fetch(*arguments, index:
|
310
|
+
def code_fetch(*arguments, index: 0, **globals)
|
341
311
|
default =
|
342
312
|
(
|
343
313
|
if arguments.last.is_a?(Function) && arguments.size > 1
|
@@ -346,45 +316,31 @@ class Code
|
|
346
316
|
)
|
347
317
|
|
348
318
|
arguments = arguments[..-2] if default
|
319
|
+
first = arguments.first || Nothing.new
|
349
320
|
|
350
321
|
if arguments.one?
|
351
|
-
raw.fetch(
|
322
|
+
raw.fetch(first) do
|
352
323
|
if default
|
353
324
|
default.call(
|
354
|
-
arguments: [
|
355
|
-
Argument.new(arguments.first),
|
356
|
-
Argument.new(self),
|
357
|
-
Argument.new(index)
|
358
|
-
],
|
325
|
+
arguments: List.new([first, Integer.new(index), self]),
|
359
326
|
**globals
|
360
327
|
)
|
361
328
|
else
|
362
329
|
raise(
|
363
|
-
|
364
|
-
"#{
|
330
|
+
Error::KeyNotFound,
|
331
|
+
"#{first.inspect} not found on #{inspect}"
|
365
332
|
)
|
366
333
|
end
|
367
334
|
end
|
368
335
|
else
|
369
|
-
|
336
|
+
Dictionary.new(
|
370
337
|
arguments
|
371
338
|
.map
|
372
339
|
.with_index do |argument, index|
|
373
340
|
if default
|
374
|
-
[
|
375
|
-
argument,
|
376
|
-
code_fetch(
|
377
|
-
argument,
|
378
|
-
default,
|
379
|
-
index: Integer.new(index),
|
380
|
-
**globals
|
381
|
-
)
|
382
|
-
]
|
341
|
+
[argument, code_fetch(argument, default, index:, **globals)]
|
383
342
|
else
|
384
|
-
[
|
385
|
-
argument,
|
386
|
-
code_fetch(argument, index: Integer.new(index), **globals)
|
387
|
-
]
|
343
|
+
[argument, code_fetch(argument, index:, **globals)]
|
388
344
|
end
|
389
345
|
end
|
390
346
|
.to_h
|
@@ -401,7 +357,7 @@ class Code
|
|
401
357
|
end
|
402
358
|
|
403
359
|
def code_flatten(level = nil)
|
404
|
-
level
|
360
|
+
level = Integer.new(-1) if level.nil? || level.falsy?
|
405
361
|
code_to_list.code_flatten(level)
|
406
362
|
end
|
407
363
|
|
@@ -439,12 +395,7 @@ class Code
|
|
439
395
|
else
|
440
396
|
raw.keep_if.with_index do |(key, value), index|
|
441
397
|
argument.call(
|
442
|
-
arguments: [
|
443
|
-
Argument.new(key),
|
444
|
-
Argument.new(value),
|
445
|
-
Argument.new(self),
|
446
|
-
Argument.new(Integer.new(index))
|
447
|
-
],
|
398
|
+
arguments: List.new([key, value, Integer.new(index), self]),
|
448
399
|
**globals
|
449
400
|
).truthy?
|
450
401
|
end
|
@@ -459,12 +410,7 @@ class Code
|
|
459
410
|
else
|
460
411
|
raw.keep_if.with_index do |(key, value), index|
|
461
412
|
argument.call(
|
462
|
-
arguments: [
|
463
|
-
Argument.new(key),
|
464
|
-
Argument.new(value),
|
465
|
-
Argument.new(self),
|
466
|
-
Argument.new(Integer.new(index))
|
467
|
-
],
|
413
|
+
arguments: List.new([key, value, Integer.new(index), self]),
|
468
414
|
**globals
|
469
415
|
).falsy?
|
470
416
|
rescue Error::Next => e
|
@@ -478,10 +424,7 @@ class Code
|
|
478
424
|
def code_key(value, function = nil, **globals)
|
479
425
|
if function
|
480
426
|
raw.key(value) ||
|
481
|
-
function.call(
|
482
|
-
arguments: [Argument.new(value), Argument.new(self)],
|
483
|
-
**globals
|
484
|
-
)
|
427
|
+
function.call(arguments: List.new([value, self]), **globals)
|
485
428
|
else
|
486
429
|
raw.key(value) || Nothing.new
|
487
430
|
end
|
@@ -510,13 +453,10 @@ class Code
|
|
510
453
|
if conflict
|
511
454
|
conflict
|
512
455
|
.call(
|
513
|
-
arguments:
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
Argument.new(self),
|
518
|
-
Argument.new(Integer.new(index))
|
519
|
-
],
|
456
|
+
arguments:
|
457
|
+
List.new(
|
458
|
+
[key, old_value, new_value, Integer.new(index), self]
|
459
|
+
),
|
520
460
|
**globals
|
521
461
|
)
|
522
462
|
.tap { index += 1 }
|
@@ -544,12 +484,7 @@ class Code
|
|
544
484
|
else
|
545
485
|
raw.select!.with_index do |(key, value), index|
|
546
486
|
argument.call(
|
547
|
-
arguments: [
|
548
|
-
Argument.new(key),
|
549
|
-
Argument.new(value),
|
550
|
-
Argument.new(self),
|
551
|
-
Argument.new(Integer.new(index))
|
552
|
-
],
|
487
|
+
arguments: List.new([key, value, Integer.new(index), self]),
|
553
488
|
**globals
|
554
489
|
).truthy?
|
555
490
|
rescue Error::Next => e
|
@@ -567,12 +502,7 @@ class Code
|
|
567
502
|
self.class.new(
|
568
503
|
raw.select.with_index do |(key, value), index|
|
569
504
|
argument.call(
|
570
|
-
arguments: [
|
571
|
-
Argument.new(key),
|
572
|
-
Argument.new(value),
|
573
|
-
Argument.new(self),
|
574
|
-
Argument.new(Integer.new(index))
|
575
|
-
],
|
505
|
+
arguments: List.new([key, value, Integer.new(index), self]),
|
576
506
|
**globals
|
577
507
|
).truthy?
|
578
508
|
rescue Error::Next => e
|
@@ -623,15 +553,15 @@ class Code
|
|
623
553
|
List.new(raw.to_a.map { |key_value| List.new(key_value) })
|
624
554
|
end
|
625
555
|
|
556
|
+
def to_h
|
557
|
+
raw
|
558
|
+
end
|
559
|
+
|
626
560
|
def code_transform_values(function, **globals)
|
627
561
|
self.class.new(
|
628
562
|
raw.transform_values.with_index do |value, index|
|
629
563
|
function.call(
|
630
|
-
arguments: [
|
631
|
-
Argument.new(value),
|
632
|
-
Argument.new(self),
|
633
|
-
Argument.new(Integer.new(index))
|
634
|
-
],
|
564
|
+
arguments: List.new([value, Integer.new(index), self]),
|
635
565
|
**globals
|
636
566
|
)
|
637
567
|
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
|