code-ruby 0.10.4 → 0.12.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.lock +2 -2
- data/bin/code +6 -0
- data/bin/console +5 -0
- data/lib/code/node/base_10.rb +10 -10
- data/lib/code/node/base_16.rb +3 -2
- data/lib/code/node/base_2.rb +3 -2
- data/lib/code/node/base_8.rb +3 -2
- data/lib/code/node/boolean.rb +5 -4
- data/lib/code/node/call.rb +13 -19
- data/lib/code/node/call_argument.rb +8 -4
- data/lib/code/node/code.rb +4 -2
- data/lib/code/node/decimal.rb +8 -10
- data/lib/code/node/dictionary.rb +15 -8
- data/lib/code/node/function.rb +5 -9
- data/lib/code/node/function_parameter.rb +8 -4
- data/lib/code/node/if.rb +14 -12
- data/lib/code/node/left_operation.rb +10 -10
- data/lib/code/node/list.rb +4 -3
- data/lib/code/node/negation.rb +8 -4
- data/lib/code/node/not.rb +8 -4
- data/lib/code/node/nothing.rb +4 -3
- data/lib/code/node/number.rb +3 -3
- data/lib/code/node/right_operation.rb +19 -16
- data/lib/code/node/splat.rb +8 -4
- data/lib/code/node/square_bracket.rb +8 -11
- data/lib/code/node/statement.rb +27 -27
- data/lib/code/node/string.rb +14 -11
- data/lib/code/node/ternary.rb +8 -8
- data/lib/code/node/unary_minus.rb +8 -4
- data/lib/code/node/while.rb +15 -13
- data/lib/code/node.rb +1 -7
- data/lib/code/object/argument.rb +4 -3
- data/lib/code/object/boolean.rb +5 -4
- data/lib/code/object/class.rb +4 -3
- data/lib/code/object/code.rb +33 -0
- data/lib/code/object/context.rb +7 -5
- data/lib/code/object/date.rb +31 -6
- data/lib/code/object/decimal.rb +36 -31
- data/lib/code/object/dictionary.rb +4 -4
- data/lib/code/object/duration.rb +8 -5
- data/lib/code/object/function.rb +42 -28
- data/lib/code/object/global.rb +58 -38
- data/lib/code/object/integer.rb +23 -26
- data/lib/code/object/list.rb +5 -5
- data/lib/code/object/nothing.rb +2 -4
- data/lib/code/object/parameter.rb +43 -0
- data/lib/code/object/range.rb +13 -11
- data/lib/code/object/string.rb +7 -7
- data/lib/code/object/time.rb +15 -8
- data/lib/code/object.rb +104 -11
- data/lib/code/parser/code.rb +1 -1
- data/lib/code/parser/left_operation.rb +2 -2
- data/lib/code/parser/list.rb +2 -2
- data/lib/code/parser/right_operation.rb +2 -2
- data/lib/code/parser/whitespace.rb +2 -2
- data/lib/code/parser.rb +1 -1
- data/lib/code/type/sig.rb +2 -2
- data/lib/code/type.rb +12 -4
- data/lib/code/version.rb +1 -1
- data/lib/code-ruby.rb +7 -0
- data/lib/code.rb +8 -5
- data/spec/code/object/dictionary_spec.rb +0 -2
- data/spec/code_spec.rb +122 -16
- metadata +5 -3
- data/lib/code/object/number.rb +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b04f0e4774e945bbf969c0159eaf23db99d9208faa98e4ae2ed575c1a363baf9
|
4
|
+
data.tar.gz: bf3de392fa1af6540d653d35248089d49b39da4addfd539e7594e0ac66c15def
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 05a921e1f388872311df4f61df4dcf808cc1d4bdaccbf2bdbdd65cc58b5495edac205c003397c83254f257a9ad114b093f2470018dc12fc4d7998ae7e1feaa7d
|
7
|
+
data.tar.gz: f856f404a8bebf4d802d2d0ab427e091f5c556da3cd24c3f583a09bf646dedef086e31b933c8933f86868ec9b501d1594f8d7e5272bcdbf1a7dea9571e825cf6
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
code-ruby (0.
|
4
|
+
code-ruby (0.11.0)
|
5
5
|
activesupport (~> 7)
|
6
6
|
bigdecimal (~> 3)
|
7
7
|
json (~> 2)
|
@@ -30,7 +30,7 @@ GEM
|
|
30
30
|
i18n (1.14.1)
|
31
31
|
concurrent-ruby (~> 1.0)
|
32
32
|
json (2.7.1)
|
33
|
-
language-ruby (0.
|
33
|
+
language-ruby (0.8.0)
|
34
34
|
zeitwerk (~> 2)
|
35
35
|
minitest (5.22.2)
|
36
36
|
mutex_m (0.2.0)
|
data/bin/code
CHANGED
@@ -42,6 +42,12 @@ argv =
|
|
42
42
|
"Set timeout in seconds"
|
43
43
|
) { |timeout| options[:timeout] = timeout.to_f }
|
44
44
|
|
45
|
+
opts.on(
|
46
|
+
"-z TIME_ZONE",
|
47
|
+
"--time-zone TIME_ZONE",
|
48
|
+
"Set time zone"
|
49
|
+
) { |time_zone| Time.zone = time_zone }
|
50
|
+
|
45
51
|
opts.on("--profile", "Profile Ruby code") do |_timeout|
|
46
52
|
require "ruby-prof"
|
47
53
|
options[:profile] = true
|
data/bin/console
ADDED
data/lib/code/node/base_10.rb
CHANGED
@@ -4,26 +4,26 @@ class Code
|
|
4
4
|
class Node
|
5
5
|
class Base10 < Node
|
6
6
|
def initialize(parsed)
|
7
|
-
|
7
|
+
return if parsed.blank?
|
8
|
+
@whole = parsed.delete(:whole).presence
|
8
9
|
|
9
10
|
if parsed.key?(:exponent)
|
10
|
-
@exponent = Node::Statement.new(parsed.delete(:exponent))
|
11
|
+
@exponent = Node::Statement.new(parsed.delete(:exponent).presence)
|
11
12
|
end
|
12
|
-
|
13
|
-
super(parsed)
|
14
13
|
end
|
15
14
|
|
16
15
|
def evaluate(**args)
|
17
|
-
if @exponent
|
16
|
+
if @exponent && @whole
|
18
17
|
exponent = @exponent.evaluate(**args)
|
19
|
-
|
20
|
-
|
21
|
-
::Code::Object::Integer.new(@whole.to_i, exponent:)
|
18
|
+
if exponent.is_a?(Object::Integer)
|
19
|
+
Object::Integer.new(@whole, exponent)
|
22
20
|
else
|
23
|
-
|
21
|
+
Object::Decimal.new(@whole, exponent)
|
24
22
|
end
|
23
|
+
elsif @whole
|
24
|
+
Object::Integer.new(@whole.to_i)
|
25
25
|
else
|
26
|
-
|
26
|
+
Object::Nothing.new
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
data/lib/code/node/base_16.rb
CHANGED
@@ -4,11 +4,12 @@ class Code
|
|
4
4
|
class Node
|
5
5
|
class Base16 < Node
|
6
6
|
def initialize(parsed)
|
7
|
-
|
7
|
+
return if parsed.blank?
|
8
|
+
@base_16 = parsed.presence
|
8
9
|
end
|
9
10
|
|
10
11
|
def evaluate(**_args)
|
11
|
-
|
12
|
+
@base_16 ? Object::Integer.new(@base_16.to_i(16)) : Object::Nothing.new
|
12
13
|
end
|
13
14
|
end
|
14
15
|
end
|
data/lib/code/node/base_2.rb
CHANGED
@@ -4,11 +4,12 @@ class Code
|
|
4
4
|
class Node
|
5
5
|
class Base2 < Node
|
6
6
|
def initialize(parsed)
|
7
|
-
|
7
|
+
return if parsed.blank?
|
8
|
+
@base_2 = parsed.presence
|
8
9
|
end
|
9
10
|
|
10
11
|
def evaluate(**_args)
|
11
|
-
|
12
|
+
@base_2 ? Object::Integer.new(@base_2.to_i(2)) : Object::Nothing.new
|
12
13
|
end
|
13
14
|
end
|
14
15
|
end
|
data/lib/code/node/base_8.rb
CHANGED
@@ -4,11 +4,12 @@ class Code
|
|
4
4
|
class Node
|
5
5
|
class Base8 < Node
|
6
6
|
def initialize(parsed)
|
7
|
-
|
7
|
+
return if parsed.blank?
|
8
|
+
@base_8 = parsed.presence
|
8
9
|
end
|
9
10
|
|
10
11
|
def evaluate(**_args)
|
11
|
-
|
12
|
+
@base_8 ? Object::Integer.new(@base_8.to_i(8)) : Object::Nothing.new
|
12
13
|
end
|
13
14
|
end
|
14
15
|
end
|
data/lib/code/node/boolean.rb
CHANGED
@@ -7,16 +7,17 @@ class Code
|
|
7
7
|
FALSE_KEYWORD = "false"
|
8
8
|
|
9
9
|
def initialize(parsed)
|
10
|
-
|
10
|
+
return if parsed.blank?
|
11
|
+
@boolean = parsed.presence
|
11
12
|
end
|
12
13
|
|
13
14
|
def evaluate(**_args)
|
14
15
|
if @boolean == TRUE_KEYWORD
|
15
|
-
|
16
|
+
Object::Boolean.new(true)
|
16
17
|
elsif @boolean == FALSE_KEYWORD
|
17
|
-
|
18
|
+
Object::Boolean.new(false)
|
18
19
|
else
|
19
|
-
|
20
|
+
Object::Nothing.new
|
20
21
|
end
|
21
22
|
end
|
22
23
|
end
|
data/lib/code/node/call.rb
CHANGED
@@ -5,39 +5,33 @@ class Code
|
|
5
5
|
class Call < Node
|
6
6
|
class Block < Node
|
7
7
|
def initialize(parsed)
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
.map { |parameter| FunctionParameter.new(parameter) }
|
8
|
+
return if parsed.blank?
|
9
|
+
@parameters = parsed.delete(:parameters) { [] }.presence || []
|
10
|
+
@parameters.map! { |parameter| FunctionParameter.new(parameter) }
|
12
11
|
|
13
|
-
@body = Code.new(parsed.delete(:body))
|
14
|
-
|
15
|
-
super(parsed)
|
12
|
+
@body = Code.new(parsed.delete(:body).presence)
|
16
13
|
end
|
17
14
|
|
18
15
|
def evaluate(**_args)
|
19
|
-
Object::Argument.new(
|
20
|
-
Object::Function.new(parameters: @parameters, body: @body)
|
21
|
-
)
|
16
|
+
Object::Argument.new(Object::Function.new(@parameters, @body))
|
22
17
|
end
|
23
18
|
end
|
24
19
|
|
25
20
|
def initialize(parsed)
|
26
|
-
|
27
|
-
@
|
28
|
-
|
29
|
-
|
30
|
-
.map { |argument| CallArgument.new(argument) }
|
31
|
-
|
32
|
-
@block = Call::Block.new(parsed.delete(:block)) if parsed.key?(:block)
|
21
|
+
return if parsed.blank?
|
22
|
+
@name = parsed.delete(:name).presence
|
23
|
+
@arguments = parsed.delete(:arguments).presence || []
|
24
|
+
@arguments.map! { |argument| CallArgument.new(argument) }
|
33
25
|
|
34
|
-
|
26
|
+
if parsed.key?(:block)
|
27
|
+
@block = Call::Block.new(parsed.delete(:block).presence)
|
28
|
+
end
|
35
29
|
end
|
36
30
|
|
37
31
|
def evaluate(**args)
|
38
32
|
arguments = []
|
39
33
|
|
40
|
-
@arguments.each do |argument|
|
34
|
+
(@arguments || []).each do |argument|
|
41
35
|
if argument.keyword?
|
42
36
|
if arguments.last&.value.is_a?(Object::Dictionary)
|
43
37
|
arguments.last.value.code_set(
|
@@ -4,15 +4,19 @@ class Code
|
|
4
4
|
class Node
|
5
5
|
class CallArgument < Node
|
6
6
|
def initialize(parsed)
|
7
|
-
|
8
|
-
@
|
7
|
+
return if parsed.blank?
|
8
|
+
@value = Node::Code.new(parsed.delete(:value).presence)
|
9
|
+
@name = parsed.delete(:name).presence
|
9
10
|
end
|
10
11
|
|
11
12
|
def evaluate(**args)
|
12
13
|
if @name
|
13
|
-
Object::Argument.new(
|
14
|
+
Object::Argument.new(
|
15
|
+
@value&.evaluate(**args) || Object::Nothing.new,
|
16
|
+
name:
|
17
|
+
)
|
14
18
|
else
|
15
|
-
Object::Argument.new(@value
|
19
|
+
Object::Argument.new(@value&.evaluate(**args) || Object::Nothing.new)
|
16
20
|
end
|
17
21
|
end
|
18
22
|
|
data/lib/code/node/code.rb
CHANGED
@@ -4,13 +4,15 @@ class Code
|
|
4
4
|
class Node
|
5
5
|
class Code < Node
|
6
6
|
def initialize(parsed)
|
7
|
-
|
7
|
+
return if parsed.blank?
|
8
|
+
@statements =
|
9
|
+
(parsed.presence || []).map { |statement| Statement.new(statement) }
|
8
10
|
end
|
9
11
|
|
10
12
|
def evaluate(**args)
|
11
13
|
last = Object::Nothing.new
|
12
14
|
|
13
|
-
@statements.each do |statement|
|
15
|
+
(@statements || []).each do |statement|
|
14
16
|
last = statement.evaluate(**args.merge(object: Object::Global.new))
|
15
17
|
end
|
16
18
|
|
data/lib/code/node/decimal.rb
CHANGED
@@ -4,23 +4,21 @@ class Code
|
|
4
4
|
class Node
|
5
5
|
class Decimal < Node
|
6
6
|
def initialize(parsed)
|
7
|
-
|
7
|
+
return if parsed.blank?
|
8
|
+
@decimal = parsed.delete(:decimal).presence
|
8
9
|
|
9
10
|
if parsed.key?(:exponent)
|
10
|
-
@exponent =
|
11
|
+
@exponent = Statement.new(parsed.delete(:exponent).presence)
|
11
12
|
end
|
12
|
-
|
13
|
-
super(parsed)
|
14
13
|
end
|
15
14
|
|
16
15
|
def evaluate(**args)
|
17
|
-
if @exponent
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
)
|
16
|
+
if @exponent && @decimal
|
17
|
+
Object::Decimal.new(@decimal, @exponent.evaluate(**args))
|
18
|
+
elsif @decimal
|
19
|
+
Object::Decimal.new(@decimal)
|
22
20
|
else
|
23
|
-
|
21
|
+
Object::Nothing.new
|
24
22
|
end
|
25
23
|
end
|
26
24
|
end
|
data/lib/code/node/dictionary.rb
CHANGED
@@ -5,17 +5,20 @@ class Code
|
|
5
5
|
class Dictionary < Node
|
6
6
|
class KeyValue < Node
|
7
7
|
def initialize(parsed)
|
8
|
+
return if parsed.blank?
|
8
9
|
if parsed.key?(:statement)
|
9
|
-
@key = Node::Statement.new(parsed.delete(:statement))
|
10
|
+
@key = Node::Statement.new(parsed.delete(:statement).presence)
|
10
11
|
elsif parsed.key?(:name)
|
11
|
-
@key = Node::String.new([{ text: parsed.delete(:name) }])
|
12
|
+
@key = Node::String.new([{ text: parsed.delete(:name).presence }])
|
12
13
|
end
|
13
14
|
|
14
|
-
|
15
|
+
if parsed[:value].presence
|
16
|
+
@value = Node::Code.new(parsed.delete(:value).presence)
|
17
|
+
end
|
15
18
|
end
|
16
19
|
|
17
20
|
def evaluate(**args)
|
18
|
-
key = @key
|
21
|
+
key = @key&.evaluate(**args) || Object::Nothing.new
|
19
22
|
|
20
23
|
if @value
|
21
24
|
value = @value.evaluate(**args)
|
@@ -27,14 +30,18 @@ class Code
|
|
27
30
|
end
|
28
31
|
|
29
32
|
def initialize(parsed)
|
30
|
-
|
31
|
-
@key_values =
|
32
|
-
|
33
|
+
return if parsed.blank?
|
34
|
+
@key_values = parsed.presence || []
|
35
|
+
@key_values.map! do |key_value|
|
36
|
+
Node::Dictionary::KeyValue.new(key_value)
|
37
|
+
end
|
33
38
|
end
|
34
39
|
|
35
40
|
def evaluate(**args)
|
36
41
|
::Code::Object::Dictionary.new(
|
37
|
-
@key_values
|
42
|
+
(@key_values || [])
|
43
|
+
.map { |key_value| key_value.evaluate(**args) }
|
44
|
+
.to_h
|
38
45
|
)
|
39
46
|
end
|
40
47
|
end
|
data/lib/code/node/function.rb
CHANGED
@@ -4,19 +4,15 @@ class Code
|
|
4
4
|
class Node
|
5
5
|
class Function < Node
|
6
6
|
def initialize(parsed)
|
7
|
-
|
8
|
-
@parameters = []
|
7
|
+
return if parsed.blank?
|
8
|
+
@parameters = parsed.delete(:parameters).presence || []
|
9
|
+
@parameters.map! { |parameter| FunctionParameter.new(parameter) }
|
9
10
|
|
10
|
-
@
|
11
|
-
@parameters.map { |parameter| Node::FunctionParameter.new(parameter) }
|
12
|
-
|
13
|
-
@body = Node::Code.new(parsed.delete(:body))
|
14
|
-
|
15
|
-
super(parsed)
|
11
|
+
@body = Code.new(parsed.delete(:body).presence)
|
16
12
|
end
|
17
13
|
|
18
14
|
def evaluate(**_args)
|
19
|
-
|
15
|
+
Object::Function.new(@parameters, @body)
|
20
16
|
end
|
21
17
|
end
|
22
18
|
end
|
@@ -4,13 +4,13 @@ class Code
|
|
4
4
|
class Node
|
5
5
|
class FunctionParameter < Node
|
6
6
|
def initialize(parsed)
|
7
|
-
|
8
|
-
@
|
9
|
-
|
7
|
+
return if parsed.blank?
|
8
|
+
@name = parsed.delete(:name).presence
|
9
|
+
@keyword = parsed.delete(:keyword).present?
|
10
10
|
end
|
11
11
|
|
12
12
|
def name
|
13
|
-
|
13
|
+
Object::String.new(@name)
|
14
14
|
end
|
15
15
|
|
16
16
|
def regular?
|
@@ -28,6 +28,10 @@ class Code
|
|
28
28
|
def keyword_splat?
|
29
29
|
false
|
30
30
|
end
|
31
|
+
|
32
|
+
def default
|
33
|
+
nil
|
34
|
+
end
|
31
35
|
end
|
32
36
|
end
|
33
37
|
end
|
data/lib/code/node/if.rb
CHANGED
@@ -12,22 +12,24 @@ class Code
|
|
12
12
|
attr_reader :operator, :statement, :body
|
13
13
|
|
14
14
|
def initialize(parsed)
|
15
|
-
|
16
|
-
@
|
15
|
+
return if parsed.blank?
|
16
|
+
@operator = parsed.delete(:operator).presence
|
17
|
+
@body = Node::Code.new(parsed.delete(:body).presence)
|
17
18
|
|
18
|
-
|
19
|
-
|
20
|
-
|
19
|
+
if parsed.key?(:statement)
|
20
|
+
@statement = Node::Statement.new(parsed.delete(:statement).presence)
|
21
|
+
end
|
21
22
|
end
|
22
23
|
end
|
23
24
|
|
24
25
|
def initialize(parsed)
|
25
|
-
|
26
|
-
@
|
27
|
-
@
|
28
|
-
|
29
|
-
|
30
|
-
|
26
|
+
return if parsed.blank?
|
27
|
+
@first_operator = parsed.delete(:first_operator).presence
|
28
|
+
@first_statement =
|
29
|
+
Node::Statement.new(parsed.delete(:first_statement).presence)
|
30
|
+
@first_body = Node::Code.new(parsed.delete(:first_body).presence)
|
31
|
+
@elses = (parsed.delete(:elses).presence || [])
|
32
|
+
@elses.map! { |elses| Node::If::Else.new(elses) }
|
31
33
|
end
|
32
34
|
|
33
35
|
def evaluate(**args)
|
@@ -38,7 +40,7 @@ class Code
|
|
38
40
|
@first_statement.evaluate(**args).falsy?
|
39
41
|
@first_body.evaluate(**args)
|
40
42
|
else
|
41
|
-
@elses.each do |elses|
|
43
|
+
(@elses || []).each do |elses|
|
42
44
|
if elses.operator == ELSIF_KEYWORD &&
|
43
45
|
elses.statement.evaluate(**args).truthy?
|
44
46
|
return elses.body.evaluate(**args)
|
@@ -10,8 +10,9 @@ class Code
|
|
10
10
|
attr_reader :operator, :statement
|
11
11
|
|
12
12
|
def initialize(parsed)
|
13
|
-
|
14
|
-
@
|
13
|
+
return if parsed.blank?
|
14
|
+
@operator = parsed.delete(:operator).presence
|
15
|
+
@statement = Statement.new(parsed.delete(:statement).presence)
|
15
16
|
end
|
16
17
|
|
17
18
|
def call?
|
@@ -20,15 +21,14 @@ class Code
|
|
20
21
|
end
|
21
22
|
|
22
23
|
def initialize(parsed)
|
23
|
-
|
24
|
-
@
|
25
|
-
|
26
|
-
|
27
|
-
super(parsed)
|
24
|
+
return if parsed.blank?
|
25
|
+
@first = Statement.new(parsed.delete(:first).presence)
|
26
|
+
@others = parsed.delete(:others).presence || []
|
27
|
+
@others.map! { |operator| Operator.new(operator) }
|
28
28
|
end
|
29
29
|
|
30
30
|
def evaluate(**args)
|
31
|
-
first = @first
|
31
|
+
first = @first&.evaluate(**args) || Object::Nothing.new
|
32
32
|
|
33
33
|
@others.reduce(first) do |left, right|
|
34
34
|
if right.call?
|
@@ -46,11 +46,11 @@ class Code
|
|
46
46
|
end
|
47
47
|
|
48
48
|
def resolve(**args)
|
49
|
-
first = @first
|
49
|
+
first = @first&.resolve(**args) || Object::Nothing.new
|
50
50
|
|
51
51
|
list = Object::IdentifierList.new([first])
|
52
52
|
|
53
|
-
@others.each do |other|
|
53
|
+
(@others || []).each do |other|
|
54
54
|
list.code_append(
|
55
55
|
other.statement.resolve(**args, object: list.code_last)
|
56
56
|
)
|
data/lib/code/node/list.rb
CHANGED
@@ -4,13 +4,14 @@ class Code
|
|
4
4
|
class Node
|
5
5
|
class List < Node
|
6
6
|
def initialize(parsed)
|
7
|
-
|
8
|
-
@elements =
|
7
|
+
return if parsed.blank?
|
8
|
+
@elements =
|
9
|
+
(parsed.presence || []).map { |element| Node::Code.new(element) }
|
9
10
|
end
|
10
11
|
|
11
12
|
def evaluate(**args)
|
12
13
|
::Code::Object::List.new(
|
13
|
-
@elements.map { |element| element.evaluate(**args) }
|
14
|
+
(@elements || []).map { |element| element.evaluate(**args) }
|
14
15
|
)
|
15
16
|
end
|
16
17
|
end
|
data/lib/code/node/negation.rb
CHANGED
@@ -4,13 +4,17 @@ class Code
|
|
4
4
|
class Node
|
5
5
|
class Negation < Node
|
6
6
|
def initialize(parsed)
|
7
|
-
|
8
|
-
@
|
9
|
-
|
7
|
+
return if parsed.blank?
|
8
|
+
@operator = parsed.delete(:operator).presence
|
9
|
+
@right = Node::Statement.new(parsed.delete(:right).presence)
|
10
10
|
end
|
11
11
|
|
12
12
|
def evaluate(**args)
|
13
|
-
@right
|
13
|
+
if @right
|
14
|
+
@right.evaluate(**args).call(operator: @operator, **args)
|
15
|
+
else
|
16
|
+
Object::Nothing.new
|
17
|
+
end
|
14
18
|
end
|
15
19
|
end
|
16
20
|
end
|
data/lib/code/node/not.rb
CHANGED
@@ -4,13 +4,17 @@ class Code
|
|
4
4
|
class Node
|
5
5
|
class Not < Node
|
6
6
|
def initialize(parsed)
|
7
|
-
|
8
|
-
@
|
9
|
-
|
7
|
+
return if parsed.blank?
|
8
|
+
@operator = parsed.delete(:operator).presence
|
9
|
+
@right = Node::Statement.new(parsed.delete(:right).presence)
|
10
10
|
end
|
11
11
|
|
12
12
|
def evaluate(**args)
|
13
|
-
@right
|
13
|
+
if @right
|
14
|
+
@right.evaluate(**args).call(operator: @operator, **args)
|
15
|
+
else
|
16
|
+
Object::Nothing.new
|
17
|
+
end
|
14
18
|
end
|
15
19
|
end
|
16
20
|
end
|
data/lib/code/node/nothing.rb
CHANGED
@@ -3,12 +3,13 @@
|
|
3
3
|
class Code
|
4
4
|
class Node
|
5
5
|
class Nothing < Node
|
6
|
-
def initialize(
|
7
|
-
|
6
|
+
def initialize(parsed)
|
7
|
+
return if parsed.blank?
|
8
|
+
@nothing = parsed.presence
|
8
9
|
end
|
9
10
|
|
10
11
|
def evaluate(**_args)
|
11
|
-
|
12
|
+
Object::Nothing.new
|
12
13
|
end
|
13
14
|
end
|
14
15
|
end
|
data/lib/code/node/number.rb
CHANGED
@@ -4,6 +4,8 @@ class Code
|
|
4
4
|
class Node
|
5
5
|
class Number < Node
|
6
6
|
def initialize(parsed)
|
7
|
+
return if parsed.blank?
|
8
|
+
|
7
9
|
if parsed.key?(:decimal)
|
8
10
|
@statement = Node::Decimal.new(parsed.delete(:decimal))
|
9
11
|
elsif parsed.key?(:base_16)
|
@@ -15,12 +17,10 @@ class Code
|
|
15
17
|
elsif parsed.key?(:base_2)
|
16
18
|
@statement = Node::Base2.new(parsed.delete(:base_2))
|
17
19
|
end
|
18
|
-
|
19
|
-
super(parsed)
|
20
20
|
end
|
21
21
|
|
22
22
|
def evaluate(**args)
|
23
|
-
@statement
|
23
|
+
@statement&.evaluate(**args) || Object::Nothing.new
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|