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.
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