code-ruby 0.13.1 → 0.14.1

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.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +15 -0
  3. data/.github/workflows/ci.yml +31 -0
  4. data/.rubocop.yml +8 -0
  5. data/Gemfile +2 -0
  6. data/Gemfile.lock +52 -4
  7. data/bin/bundle-audit +31 -0
  8. data/bin/bundler-audit +31 -0
  9. data/bin/console +1 -0
  10. data/bin/rspec +31 -0
  11. data/bin/rubocop +31 -0
  12. data/lib/code/error.rb +0 -3
  13. data/lib/code/node/base_10.rb +4 -3
  14. data/lib/code/node/base_16.rb +1 -0
  15. data/lib/code/node/base_2.rb +1 -0
  16. data/lib/code/node/base_8.rb +1 -0
  17. data/lib/code/node/boolean.rb +1 -0
  18. data/lib/code/node/call.rb +14 -15
  19. data/lib/code/node/call_argument.rb +4 -4
  20. data/lib/code/node/code.rb +1 -0
  21. data/lib/code/node/decimal.rb +4 -3
  22. data/lib/code/node/dictionary.rb +5 -3
  23. data/lib/code/node/function.rb +1 -0
  24. data/lib/code/node/function_parameter.rb +14 -0
  25. data/lib/code/node/if.rb +6 -4
  26. data/lib/code/node/left_operation.rb +3 -3
  27. data/lib/code/node/list.rb +1 -0
  28. data/lib/code/node/negation.rb +1 -0
  29. data/lib/code/node/not.rb +1 -0
  30. data/lib/code/node/nothing.rb +1 -0
  31. data/lib/code/node/right_operation.rb +3 -2
  32. data/lib/code/node/splat.rb +1 -0
  33. data/lib/code/node/square_bracket.rb +1 -0
  34. data/lib/code/node/string.rb +3 -0
  35. data/lib/code/node/ternary.rb +4 -3
  36. data/lib/code/node/unary_minus.rb +1 -0
  37. data/lib/code/node/while.rb +4 -3
  38. data/lib/code/object/boolean.rb +2 -2
  39. data/lib/code/object/context.rb +1 -1
  40. data/lib/code/object/decimal.rb +9 -21
  41. data/lib/code/object/dictionary.rb +80 -113
  42. data/lib/code/object/function.rb +25 -35
  43. data/lib/code/object/global.rb +33 -32
  44. data/lib/code/object/identifier_list.rb +4 -4
  45. data/lib/code/object/integer.rb +14 -23
  46. data/lib/code/object/json.rb +10 -2
  47. data/lib/code/object/list.rb +50 -23
  48. data/lib/code/object/parameter.rb +18 -10
  49. data/lib/code/object/range.rb +33 -10
  50. data/lib/code/object/string.rb +2 -2
  51. data/lib/code/object/time.rb +4 -4
  52. data/lib/code/object.rb +31 -50
  53. data/lib/code/parser/string.rb +1 -1
  54. data/lib/code/type/repeat.rb +1 -1
  55. data/lib/code/type/sig.rb +1 -3
  56. data/lib/code/version.rb +1 -1
  57. data/lib/code-ruby.rb +2 -7
  58. data/lib/code.rb +1 -3
  59. data/spec/code/object/dictionary_spec.rb +6 -6
  60. data/spec/code_spec.rb +7 -8
  61. data/yarn.lock +4 -0
  62. metadata +10 -3
  63. 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: [Object::Argument.new(right)],
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: [Object::Argument.new(right)],
67
+ arguments: Object::List.new([right]),
67
68
  **args
68
69
  )
69
70
  end
@@ -5,6 +5,7 @@ class Code
5
5
  class Splat < Node
6
6
  def initialize(parsed)
7
7
  return if parsed.blank?
8
+
8
9
  @operator = parsed.delete(:operator).presence
9
10
  @right = Node::Statement.new(parsed.delete(:right).presence)
10
11
  end
@@ -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) }
@@ -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
@@ -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
- if parsed.key?(:right)
11
- @right = Node::Statement.new(parsed.delete(:right).presence)
12
- end
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)
@@ -5,6 +5,7 @@ class Code
5
5
  class UnaryMinus < Node
6
6
  def initialize(parsed)
7
7
  return if parsed.blank?
8
+
8
9
  @operator = parsed.delete(:operator).presence
9
10
  @right = Node::Statement.new(parsed.delete(:right).presence)
10
11
  end
@@ -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?(:statement)
14
- @statement = Statement.new(parsed.delete(:statement))
15
- end
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
 
@@ -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.first&.value
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"
@@ -18,7 +18,7 @@ class Code
18
18
  elsif parent?
19
19
  parent.lookup!(identifier)
20
20
  else
21
- raise Error::Undefined, "#{identifier} is not defined"
21
+ raise Error::Undefined, "#{identifier} is not defined"
22
22
  end
23
23
  end
24
24
 
@@ -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 => e
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.first&.value
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
- value ? code_plus(value) : self
36
+ arguments.any? ? code_plus(value) : self
37
37
  when "-", "minus"
38
38
  sig(args) { (Integer | Decimal).maybe }
39
- value ? code_minus(value) : code_unary_minus
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 ||= Integer.new(0)
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 ||= Integer.new(0)
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 ||= Integer.new(0)
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 ||= Integer.new(0)
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, **_kargs, &_block)
7
- @raw = (args.first.presence || {})
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.first&.value
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.map(&:value), **globals)
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.map(&:value))
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.map(&:value))
70
+ code_except(*arguments.raw)
75
71
  when "fetch"
76
72
  sig(args) { Object.repeat(1) }
77
- code_fetch(*arguments.map(&:value), **globals)
73
+ code_fetch(*arguments.raw, **globals)
78
74
  when "fetch_values"
79
75
  sig(args) { Object.repeat(1) }
80
- code_fetch_values(*arguments.map(&:value))
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.map(&:value), **globals)
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.map(&:value), **globals)
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(arguments.first) do
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
- "#{arguments.first.inspect} not found on #{inspect}"
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: Integer.new(0), **globals)
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(arguments.first) do
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
- Code::Error::KeyNotFound,
364
- "#{arguments.first.inspect} not found on #{inspect}"
333
+ Error::KeyNotFound,
334
+ "#{first.inspect} not found on #{inspect}"
365
335
  )
366
336
  end
367
337
  end
368
338
  else
369
- self.class.new(
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 ||= Integer.new(-1)
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
- Argument.new(key),
515
- Argument.new(old_value),
516
- Argument.new(new_value),
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
@@ -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
- if parameter.regular_splat?
34
- context.code_set(
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 { |argument| argument.name == parameter.code_name }
49
- &.value
50
- argument = parameter.evaluate(**globals) if argument.nil?
51
- context.code_set(parameter.code_name, argument)
52
- elsif parameter.regular?
53
- argument = arguments[index]&.value
54
- argument = parameter.evaluate(**globals) if argument.nil?
55
- context.code_set(parameter.code_name, argument)
56
- end
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.raw.inject([]) do |signature, parameter|
64
- if parameter.keyword?
65
- if signature.last.is_a?(::Hash)
66
- signature.last.code_set(parameter.code_name, Object)
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 + [{ parameter.code_name => Object }]
62
+ signature + [Object]
70
63
  end
71
- else
72
- signature + [Object]
73
- end
74
- end + [Object.repeat]
64
+ end + [Object.repeat]
75
65
  end
76
66
  end
77
67
  end