code-ruby 0.11.0 → 0.13.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/Gemfile +1 -0
- data/Gemfile.lock +5 -3
- data/Rakefile +5 -0
- data/bin/code +6 -0
- data/lib/code/node/base_10.rb +2 -2
- data/lib/code/node/base_16.rb +1 -5
- data/lib/code/node/base_2.rb +1 -5
- data/lib/code/node/base_8.rb +1 -5
- data/lib/code/node/call.rb +4 -4
- data/lib/code/node/code.rb +2 -1
- data/lib/code/node/decimal.rb +1 -4
- data/lib/code/node/dictionary.rb +6 -2
- data/lib/code/node/function.rb +3 -3
- data/lib/code/node/function_parameter.rb +5 -1
- data/lib/code/node/if.rb +2 -1
- data/lib/code/node/list.rb +2 -1
- data/lib/code/node/statement.rb +23 -23
- data/lib/code/node/string.rb +2 -1
- data/lib/code/object/argument.rb +4 -3
- data/lib/code/object/boolean.rb +4 -24
- data/lib/code/object/class.rb +3 -19
- data/lib/code/object/code.rb +16 -0
- data/lib/code/object/context.rb +6 -9
- data/lib/code/object/date.rb +25 -17
- data/lib/code/object/decimal.rb +30 -38
- data/lib/code/object/dictionary.rb +6 -21
- data/lib/code/object/duration.rb +7 -21
- data/lib/code/object/function.rb +29 -45
- data/lib/code/object/global.rb +56 -40
- data/lib/code/object/identifier_list.rb +0 -4
- data/lib/code/object/integer.rb +23 -46
- data/lib/code/object/json.rb +29 -0
- data/lib/code/object/list.rb +4 -21
- data/lib/code/object/nothing.rb +2 -20
- data/lib/code/object/parameter.rb +51 -0
- data/lib/code/object/range.rb +12 -27
- data/lib/code/object/string.rb +6 -27
- data/lib/code/object/time.rb +14 -24
- data/lib/code/object.rb +155 -15
- data/lib/code/parser.rb +1 -1
- data/lib/code/type.rb +10 -2
- data/lib/code/version.rb +1 -1
- data/lib/code-ruby.rb +6 -0
- data/lib/code.rb +8 -5
- data/spec/code/object/dictionary_spec.rb +0 -2
- data/spec/code_spec.rb +141 -29
- metadata +6 -3
- data/lib/code/object/number.rb +0 -11
data/lib/code/object/decimal.rb
CHANGED
@@ -2,23 +2,15 @@
|
|
2
2
|
|
3
3
|
class Code
|
4
4
|
class Object
|
5
|
-
class Decimal <
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
decimal = decimal.raw if decimal.
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
raise ::Code::Error::TypeError, "exponent is not a number"
|
15
|
-
end
|
16
|
-
|
17
|
-
@raw *= 10**exponent.raw
|
18
|
-
end
|
19
|
-
|
20
|
-
def self.name
|
21
|
-
"Decimal"
|
5
|
+
class Decimal < Object
|
6
|
+
def initialize(*args, **_kargs, &_block)
|
7
|
+
decimal = args.first || "0"
|
8
|
+
exponent = args.second || "0"
|
9
|
+
decimal = decimal.raw if decimal.is_an?(Object)
|
10
|
+
exponent = exponent.raw if exponent.is_an?(Object)
|
11
|
+
@raw = decimal.to_d * 10**exponent.to_d
|
12
|
+
rescue FloatDomainError => e
|
13
|
+
raise Error, "#{decimal.inspect} * 10**#{exponent.inspect} is invalid"
|
22
14
|
end
|
23
15
|
|
24
16
|
def call(**args)
|
@@ -28,49 +20,49 @@ class Code
|
|
28
20
|
|
29
21
|
case operator.to_s
|
30
22
|
when "%", "modulo"
|
31
|
-
sig(args) {
|
23
|
+
sig(args) { Integer | Decimal }
|
32
24
|
code_modulo(value)
|
33
25
|
when "&", "bitwise_and"
|
34
|
-
sig(args) {
|
26
|
+
sig(args) { Integer | Decimal }
|
35
27
|
code_bitwise_and(value)
|
36
28
|
when "*", "multiplication"
|
37
|
-
sig(args) {
|
29
|
+
sig(args) { Integer | Decimal }
|
38
30
|
code_multiplication(value)
|
39
31
|
when "**", "power"
|
40
|
-
sig(args) {
|
32
|
+
sig(args) { Integer | Decimal }
|
41
33
|
code_power(value)
|
42
34
|
when "+", "plus"
|
43
35
|
sig(args) { Object.maybe }
|
44
36
|
value ? code_plus(value) : self
|
45
37
|
when "-", "minus"
|
46
|
-
sig(args) {
|
38
|
+
sig(args) { (Integer | Decimal).maybe }
|
47
39
|
value ? code_minus(value) : code_unary_minus
|
48
40
|
when "/", "division"
|
49
|
-
sig(args) {
|
41
|
+
sig(args) { Integer | Decimal }
|
50
42
|
code_division(value)
|
51
43
|
when "<", "inferior"
|
52
|
-
sig(args) {
|
44
|
+
sig(args) { Integer | Decimal }
|
53
45
|
code_inferior(value)
|
54
46
|
when "<<", "left_shift"
|
55
|
-
sig(args) {
|
47
|
+
sig(args) { Integer | Decimal }
|
56
48
|
code_left_shift(value)
|
57
49
|
when "<=", "inferior_or_equal"
|
58
|
-
sig(args) {
|
50
|
+
sig(args) { Integer | Decimal }
|
59
51
|
code_inferior_or_equal(value)
|
60
52
|
when "<=>", "compare"
|
61
|
-
sig(args) {
|
53
|
+
sig(args) { Integer | Decimal }
|
62
54
|
code_compare(value)
|
63
55
|
when ">", "superior"
|
64
|
-
sig(args) {
|
56
|
+
sig(args) { Integer | Decimal }
|
65
57
|
code_superior(value)
|
66
58
|
when ">=", "superior_or_equal"
|
67
|
-
sig(args) {
|
59
|
+
sig(args) { Integer | Decimal }
|
68
60
|
code_superior_or_equal(value)
|
69
61
|
when ">>", "right_shift"
|
70
|
-
sig(args) {
|
62
|
+
sig(args) { Integer | Decimal }
|
71
63
|
code_right_shift(value)
|
72
64
|
when "^", "bitwise_xor"
|
73
|
-
sig(args) {
|
65
|
+
sig(args) { Integer | Decimal }
|
74
66
|
code_bitwise_xor(value)
|
75
67
|
when "abs"
|
76
68
|
sig(args)
|
@@ -136,7 +128,7 @@ class Code
|
|
136
128
|
sig(args)
|
137
129
|
code_zero?
|
138
130
|
when "|", "bitwise_or"
|
139
|
-
sig(args) {
|
131
|
+
sig(args) { Integer | Decimal }
|
140
132
|
code_bitwise_or(value)
|
141
133
|
else
|
142
134
|
super
|
@@ -226,7 +218,7 @@ class Code
|
|
226
218
|
end
|
227
219
|
|
228
220
|
def code_plus(other)
|
229
|
-
if other.is_a?(
|
221
|
+
if other.is_an?(Integer) || other.is_a?(Decimal)
|
230
222
|
Decimal.new(raw + other.raw)
|
231
223
|
else
|
232
224
|
String.new(to_s + other.to_s)
|
@@ -303,16 +295,16 @@ class Code
|
|
303
295
|
Boolean.new(raw.zero?)
|
304
296
|
end
|
305
297
|
|
306
|
-
def
|
307
|
-
|
298
|
+
def whole?
|
299
|
+
whole == raw
|
308
300
|
end
|
309
301
|
|
310
|
-
def
|
311
|
-
raw.
|
302
|
+
def whole
|
303
|
+
raw.round
|
312
304
|
end
|
313
305
|
|
314
306
|
def as_json(...)
|
315
|
-
|
307
|
+
whole? ? whole.as_json(...) : super
|
316
308
|
end
|
317
309
|
end
|
318
310
|
end
|
@@ -3,15 +3,12 @@
|
|
3
3
|
class Code
|
4
4
|
class Object
|
5
5
|
class Dictionary < ::Code::Object
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
def self.name
|
14
|
-
"Dictionary"
|
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) }
|
15
12
|
end
|
16
13
|
|
17
14
|
def call(**args)
|
@@ -654,18 +651,6 @@ class Code
|
|
654
651
|
def code_zero?
|
655
652
|
code_size.code_zero?
|
656
653
|
end
|
657
|
-
|
658
|
-
def inspect
|
659
|
-
to_s
|
660
|
-
end
|
661
|
-
|
662
|
-
def to_s
|
663
|
-
"{#{raw.map { |key, value| "#{key.inspect} => #{value.inspect}" }.join(", ")}}"
|
664
|
-
end
|
665
|
-
|
666
|
-
def as_json(...)
|
667
|
-
raw.as_json(...)
|
668
|
-
end
|
669
654
|
end
|
670
655
|
end
|
671
656
|
end
|
data/lib/code/object/duration.rb
CHANGED
@@ -3,15 +3,13 @@
|
|
3
3
|
class Code
|
4
4
|
class Object
|
5
5
|
class Duration < Object
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
@raw =
|
11
|
-
|
12
|
-
|
13
|
-
def self.name
|
14
|
-
"Duration"
|
6
|
+
def initialize(*args, **_kargs, &_block)
|
7
|
+
raw = args.first || 0.seconds
|
8
|
+
raw = raw.raw if raw.is_an?(Object)
|
9
|
+
raw = raw.iso8601 if raw.is_an?(::ActiveSupport::Duration)
|
10
|
+
@raw = ::ActiveSupport::Duration.parse(raw.to_s)
|
11
|
+
rescue ::ActiveSupport::Duration::ISO8601Parser::ParsingError
|
12
|
+
raise Error, "#{raw.inspect} is not a valid duration"
|
15
13
|
end
|
16
14
|
|
17
15
|
def call(**args)
|
@@ -36,18 +34,6 @@ class Code
|
|
36
34
|
def code_from_now
|
37
35
|
Time.new(raw.from_now)
|
38
36
|
end
|
39
|
-
|
40
|
-
def inspect
|
41
|
-
to_s
|
42
|
-
end
|
43
|
-
|
44
|
-
def to_s
|
45
|
-
raw.to_s
|
46
|
-
end
|
47
|
-
|
48
|
-
def as_json(...)
|
49
|
-
raw.as_json(...)
|
50
|
-
end
|
51
37
|
end
|
52
38
|
end
|
53
39
|
end
|
data/lib/code/object/function.rb
CHANGED
@@ -2,22 +2,20 @@
|
|
2
2
|
|
3
3
|
class Code
|
4
4
|
class Object
|
5
|
-
class Function <
|
5
|
+
class Function < Object
|
6
6
|
attr_reader :parameters, :body
|
7
7
|
|
8
|
-
def initialize(
|
9
|
-
@parameters =
|
10
|
-
@
|
11
|
-
|
12
|
-
|
13
|
-
def self.name
|
14
|
-
"Function"
|
8
|
+
def initialize(*args, **_kargs, &_block)
|
9
|
+
@parameters = List.new(args.first.presence || [])
|
10
|
+
@parameters.raw.map! { |parameter| Parameter.new(parameter) }
|
11
|
+
@body = Code.new(args.second.presence || Nothing.new)
|
12
|
+
@raw = List.new(parameters, body)
|
15
13
|
end
|
16
14
|
|
17
15
|
def call(**args)
|
18
16
|
operator = args.fetch(:operator, nil)
|
19
17
|
arguments = args.fetch(:arguments, [])
|
20
|
-
globals = multi_fetch(args,
|
18
|
+
globals = multi_fetch(args, *GLOBALS)
|
21
19
|
|
22
20
|
case operator.to_s
|
23
21
|
when "", "call"
|
@@ -29,66 +27,52 @@ class Code
|
|
29
27
|
end
|
30
28
|
|
31
29
|
def code_call(*arguments, **globals)
|
32
|
-
context = Context.new({},
|
30
|
+
context = Context.new({}, globals[:context])
|
33
31
|
|
34
|
-
parameters.each.with_index do |parameter, index|
|
35
|
-
if parameter.
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
arguments.select(&:keyword?).map(&:name_value).to_h
|
46
|
-
)
|
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
|
47
43
|
)
|
48
|
-
|
49
|
-
argument = arguments[index]&.value
|
50
|
-
argument = parameter.evaluate(**globals) if argument.nil?
|
51
|
-
context.code_set(parameter.name, argument)
|
52
|
-
end
|
44
|
+
)
|
53
45
|
elsif parameter.keyword?
|
54
46
|
argument =
|
55
47
|
arguments
|
56
|
-
.detect { |argument| argument.name == parameter.
|
48
|
+
.detect { |argument| argument.name == parameter.code_name }
|
57
49
|
&.value
|
58
50
|
argument = parameter.evaluate(**globals) if argument.nil?
|
59
|
-
context.code_set(parameter.
|
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)
|
60
56
|
end
|
61
57
|
end
|
62
58
|
|
63
59
|
body.evaluate(**globals, context:)
|
64
60
|
end
|
65
61
|
|
66
|
-
def inspect
|
67
|
-
"function"
|
68
|
-
end
|
69
|
-
|
70
62
|
def signature_for_call
|
71
|
-
parameters.inject([]) do |signature, parameter|
|
63
|
+
parameters.raw.inject([]) do |signature, parameter|
|
72
64
|
if parameter.keyword?
|
73
65
|
if signature.last.is_a?(::Hash)
|
74
|
-
signature.last
|
66
|
+
signature.last.code_set(parameter.code_name, Object)
|
75
67
|
signature
|
76
68
|
else
|
77
|
-
signature + [{ parameter.
|
69
|
+
signature + [{ parameter.code_name => Object }]
|
78
70
|
end
|
79
71
|
else
|
80
72
|
signature + [Object]
|
81
73
|
end
|
82
74
|
end + [Object.repeat]
|
83
75
|
end
|
84
|
-
|
85
|
-
def to_s
|
86
|
-
""
|
87
|
-
end
|
88
|
-
|
89
|
-
def as_json(...)
|
90
|
-
raw.as_json(...)
|
91
|
-
end
|
92
76
|
end
|
93
77
|
end
|
94
78
|
end
|
data/lib/code/object/global.rb
CHANGED
@@ -2,9 +2,9 @@
|
|
2
2
|
|
3
3
|
class Code
|
4
4
|
class Object
|
5
|
-
class Global <
|
6
|
-
def
|
7
|
-
|
5
|
+
class Global < Object
|
6
|
+
def initialize(...)
|
7
|
+
super
|
8
8
|
end
|
9
9
|
|
10
10
|
def call(**args)
|
@@ -14,62 +14,78 @@ class Code
|
|
14
14
|
context = args.fetch(:context)
|
15
15
|
globals = multi_fetch(args, *GLOBALS)
|
16
16
|
value = arguments.first&.value
|
17
|
+
values = arguments.map(&:value)
|
17
18
|
|
18
19
|
case operator.to_s
|
19
20
|
when "Boolean"
|
20
|
-
sig(args) { Object.
|
21
|
-
value ?
|
21
|
+
sig(args) { Object.repeat }
|
22
|
+
value ? Boolean.new(*values) : Class.new(Boolean)
|
22
23
|
when "break"
|
23
|
-
sig(args) { Object.
|
24
|
+
sig(args) { Object.repeat }
|
24
25
|
raise Error::Break, value || Nothing.new
|
25
26
|
when "next"
|
26
|
-
sig(args) { Object.
|
27
|
+
sig(args) { Object.repeat }
|
27
28
|
raise Error::Next, value || Nothing.new
|
28
29
|
when "Class"
|
29
|
-
sig(args) { Object.
|
30
|
-
value ?
|
30
|
+
sig(args) { Object.repeat }
|
31
|
+
value ? Class.new(*values) : Class.new(Class)
|
31
32
|
when "Date"
|
32
|
-
sig(args) { Object.
|
33
|
-
value ?
|
33
|
+
sig(args) { Object.repeat }
|
34
|
+
value ? Date.new(*values) : Class.new(Date)
|
34
35
|
when "Decimal"
|
35
|
-
sig(args) { Object.
|
36
|
-
value ?
|
36
|
+
sig(args) { Object.repeat }
|
37
|
+
value ? Decimal.new(*values) : Class.new(Decimal)
|
37
38
|
when "Dictionary"
|
38
|
-
sig(args) { Object.
|
39
|
-
value ?
|
40
|
-
when "
|
41
|
-
sig(args) {
|
42
|
-
|
39
|
+
sig(args) { Object.repeat }
|
40
|
+
value ? Dictionary.new(*values) : Class.new(Dictionary)
|
41
|
+
when "Duration"
|
42
|
+
sig(args) { Object.repeat }
|
43
|
+
value ? Duration.new(*values) : Class.new(Duration)
|
43
44
|
when "Function"
|
44
|
-
sig(args)
|
45
|
-
|
45
|
+
sig(args)
|
46
|
+
Class.new(Function)
|
46
47
|
when "Integer"
|
47
|
-
sig(args) { Object.
|
48
|
-
value ?
|
48
|
+
sig(args) { Object.repeat }
|
49
|
+
value ? Integer.new(*values) : Class.new(Integer)
|
49
50
|
when "List"
|
50
|
-
sig(args) { Object.
|
51
|
-
value ?
|
51
|
+
sig(args) { Object.repeat }
|
52
|
+
value ? List.new(*values) : Class.new(List)
|
52
53
|
when "Nothing"
|
53
|
-
sig(args) { Object.
|
54
|
-
value ?
|
55
|
-
when "
|
56
|
-
sig(args)
|
57
|
-
|
54
|
+
sig(args) { Object.repeat }
|
55
|
+
value ? Nothing.new(*values) : Class.new(Nothing)
|
56
|
+
when "context"
|
57
|
+
sig(args)
|
58
|
+
context
|
58
59
|
when "Object"
|
59
|
-
sig(args)
|
60
|
-
|
60
|
+
sig(args)
|
61
|
+
Class.new(Object)
|
61
62
|
when "Range"
|
62
|
-
sig(args) { Object.
|
63
|
-
value ?
|
63
|
+
sig(args) { Object.repeat }
|
64
|
+
value ? Range.new(*values) : Class.new(Range)
|
64
65
|
when "String"
|
65
|
-
sig(args) { Object.
|
66
|
-
value ?
|
66
|
+
sig(args) { Object.repeat }
|
67
|
+
value ? String.new(*values) : Class.new(String)
|
67
68
|
when "Time"
|
68
|
-
sig(args) { Object.
|
69
|
-
value ?
|
70
|
-
when "
|
71
|
-
sig(args) {
|
72
|
-
value ?
|
69
|
+
sig(args) { Object.repeat }
|
70
|
+
value ? Time.new(*values) : Class.new(Time)
|
71
|
+
when "Context"
|
72
|
+
sig(args) { Object.repeat }
|
73
|
+
value ? Context.new(*values) : Class.new(Context)
|
74
|
+
when "Code"
|
75
|
+
sig(args) { Object.repeat }
|
76
|
+
value ? Code.new(*values) : Class.new(Code)
|
77
|
+
when "Argument"
|
78
|
+
sig(args) { Object.repeat }
|
79
|
+
value ? Argument.new(*values) : Class.new(Argument)
|
80
|
+
when "Parameter"
|
81
|
+
sig(args) { Object.repeat }
|
82
|
+
value ? Parameter.new(*values) : Class.new(Parameter)
|
83
|
+
when "Range"
|
84
|
+
sig(args) { Object.repeat }
|
85
|
+
value ? Range.new(*values) : Class.new(Range)
|
86
|
+
when "IdentifierList"
|
87
|
+
sig(args) { Object.repeat }
|
88
|
+
value ? IdentifierList.new(*values) : Class.new(IdentifierList)
|
73
89
|
when "evaluate"
|
74
90
|
sig(args) { Object }
|
75
91
|
Code.evaluate(value.to_s)
|
data/lib/code/object/integer.rb
CHANGED
@@ -2,22 +2,15 @@
|
|
2
2
|
|
3
3
|
class Code
|
4
4
|
class Object
|
5
|
-
class Integer <
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
whole = whole.raw if whole.
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
exponent = exponent.raw if exponent.is_a?(Number)
|
14
|
-
@raw *= 10**exponent
|
5
|
+
class Integer < Object
|
6
|
+
def initialize(*args, **_kargs, &_block)
|
7
|
+
whole = args.first || 0
|
8
|
+
exponent = args.second || 0
|
9
|
+
whole = whole.raw if whole.is_an?(Object)
|
10
|
+
exponent = exponent.raw if exponent.is_an?(Object)
|
11
|
+
@raw = whole.to_i * 10**exponent
|
15
12
|
rescue FloatDomainError => e
|
16
|
-
raise Error,
|
17
|
-
end
|
18
|
-
|
19
|
-
def self.name
|
20
|
-
"Integer"
|
13
|
+
raise Error, "#{decimal.inspect} * 10**#{exponent.inspect} is invalid"
|
21
14
|
end
|
22
15
|
|
23
16
|
def call(**args)
|
@@ -28,49 +21,49 @@ class Code
|
|
28
21
|
|
29
22
|
case operator.to_s
|
30
23
|
when "%", "modulo"
|
31
|
-
sig(args) {
|
24
|
+
sig(args) { Integer | Decimal }
|
32
25
|
code_modulo(value)
|
33
26
|
when "&", "bitwise_and"
|
34
|
-
sig(args) {
|
27
|
+
sig(args) { Integer | Decimal }
|
35
28
|
code_bitwise_and(value)
|
36
29
|
when "*", "multiplication", "×"
|
37
|
-
sig(args) {
|
30
|
+
sig(args) { Integer | Decimal | String }
|
38
31
|
code_multiplication(value)
|
39
32
|
when "**", "power"
|
40
|
-
sig(args) {
|
33
|
+
sig(args) { Integer | Decimal }
|
41
34
|
code_power(value)
|
42
35
|
when "+", "plus", "self"
|
43
36
|
sig(args) { Object.maybe }
|
44
37
|
value ? code_plus(value) : code_self
|
45
38
|
when "-", "minus", "unary_minus"
|
46
|
-
sig(args) {
|
39
|
+
sig(args) { Integer | Decimal.maybe }
|
47
40
|
value ? code_minus(value) : code_unary_minus
|
48
41
|
when "/", "division", "÷"
|
49
|
-
sig(args) {
|
42
|
+
sig(args) { Integer | Decimal }
|
50
43
|
code_division(value)
|
51
44
|
when "<", "inferior"
|
52
|
-
sig(args) {
|
45
|
+
sig(args) { Integer | Decimal }
|
53
46
|
code_inferior(value)
|
54
47
|
when "<<", "left_shift"
|
55
|
-
sig(args) {
|
48
|
+
sig(args) { Integer | Decimal }
|
56
49
|
code_left_shift(value)
|
57
50
|
when "<=", "inferior_or_equal"
|
58
|
-
sig(args) {
|
51
|
+
sig(args) { Integer | Decimal }
|
59
52
|
code_inferior_or_equal(value)
|
60
53
|
when "<=>", "compare"
|
61
|
-
sig(args) {
|
54
|
+
sig(args) { Integer | Decimal }
|
62
55
|
code_compare(value)
|
63
56
|
when ">", "superior"
|
64
|
-
sig(args) {
|
57
|
+
sig(args) { Integer | Decimal }
|
65
58
|
code_superior(value)
|
66
59
|
when ">=", "superior_or_equal"
|
67
|
-
sig(args) {
|
60
|
+
sig(args) { Integer | Decimal }
|
68
61
|
code_superior_or_equal(value)
|
69
62
|
when ">>", "right_shift"
|
70
|
-
sig(args) {
|
63
|
+
sig(args) { Integer | Decimal }
|
71
64
|
code_right_shift(value)
|
72
65
|
when "^", "bitwise_xor"
|
73
|
-
sig(args) {
|
66
|
+
sig(args) { Integer | Decimal }
|
74
67
|
code_bitwise_xor(value)
|
75
68
|
when "abs"
|
76
69
|
sig(args)
|
@@ -163,7 +156,7 @@ class Code
|
|
163
156
|
sig(args)
|
164
157
|
code_zero?
|
165
158
|
when "|", "bitwise_or"
|
166
|
-
sig(args) {
|
159
|
+
sig(args) { Integer | Decimal }
|
167
160
|
code_bitwise_or(value)
|
168
161
|
else
|
169
162
|
super
|
@@ -394,22 +387,6 @@ class Code
|
|
394
387
|
def code_days
|
395
388
|
Duration.new(raw.days)
|
396
389
|
end
|
397
|
-
|
398
|
-
def inspect
|
399
|
-
to_s
|
400
|
-
end
|
401
|
-
|
402
|
-
def succ
|
403
|
-
Integer.new(raw + 1)
|
404
|
-
end
|
405
|
-
|
406
|
-
def to_s
|
407
|
-
raw.to_s
|
408
|
-
end
|
409
|
-
|
410
|
-
def as_json(...)
|
411
|
-
raw.as_json(...)
|
412
|
-
end
|
413
390
|
end
|
414
391
|
end
|
415
392
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
class Code
|
2
|
+
class Object
|
3
|
+
class Json < Object
|
4
|
+
def self.to_code(json)
|
5
|
+
if json.is_an?(Object)
|
6
|
+
json
|
7
|
+
elsif json.is_a?(::Hash)
|
8
|
+
Dictionary.new(json)
|
9
|
+
elsif json.is_a?(::Array)
|
10
|
+
List.new(json)
|
11
|
+
elsif json.is_a?(::String)
|
12
|
+
String.new(json)
|
13
|
+
elsif json.is_a?(::Float)
|
14
|
+
Decimal.new(json)
|
15
|
+
elsif json.is_an?(::Integer)
|
16
|
+
Integer.new(json)
|
17
|
+
elsif json.is_a?(::TrueClass)
|
18
|
+
Boolean.new(json)
|
19
|
+
elsif json.is_a?(::FalseClass)
|
20
|
+
Boolean.new(json)
|
21
|
+
elsif json.is_a?(::NilClass)
|
22
|
+
Nothing.new(json)
|
23
|
+
else
|
24
|
+
Nothing.new
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/code/object/list.rb
CHANGED
@@ -2,18 +2,13 @@
|
|
2
2
|
|
3
3
|
class Code
|
4
4
|
class Object
|
5
|
-
class List <
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
raw = raw.raw if raw.is_a?(List)
|
5
|
+
class List < Object
|
6
|
+
def initialize(*args, **_kargs, &_block)
|
7
|
+
raw = args.first || Nothing.new
|
8
|
+
raw = raw.raw if raw.is_an?(Object)
|
10
9
|
@raw = raw.to_a
|
11
10
|
end
|
12
11
|
|
13
|
-
def self.name
|
14
|
-
"List"
|
15
|
-
end
|
16
|
-
|
17
12
|
def call(**args)
|
18
13
|
operator = args.fetch(:operator, nil)
|
19
14
|
arguments = args.fetch(:arguments, [])
|
@@ -234,18 +229,6 @@ class Code
|
|
234
229
|
def code_sum
|
235
230
|
raw.inject(&:code_plus) || Nothing.new
|
236
231
|
end
|
237
|
-
|
238
|
-
def inspect
|
239
|
-
to_s
|
240
|
-
end
|
241
|
-
|
242
|
-
def to_s
|
243
|
-
"[#{raw.map(&:inspect).join(", ")}]"
|
244
|
-
end
|
245
|
-
|
246
|
-
def as_json(...)
|
247
|
-
raw.as_json(...)
|
248
|
-
end
|
249
232
|
end
|
250
233
|
end
|
251
234
|
end
|