lib/code/node/if_modifier.rb in code-ruby-0.4.0 vs lib/code/node/if_modifier.rb in code-ruby-0.5.0
- old
+ new
@@ -1,48 +1,47 @@
class Code
class Node
class IfModifier < Node
- IF_KEYWORD = :if
- UNLESS_KEYWORD = :unless
- WHILE_KEYWORD = :while
- UNTIL_KEYWORD = :until
+ IF_KEYWORD = "if"
+ UNLESS_KEYWORD = "unless"
+ WHILE_KEYWORD = "while"
+ UNTIL_KEYWORD = "until"
- def initialize(if_modifier)
- @left = ::Code::Node::Statement.new(if_modifier.fetch(:left))
- @operator = if_modifier.fetch(:operator)
- @right = ::Code::Node::Statement.new(if_modifier.fetch(:right))
+ def initialize(parsed)
+ @operator = parsed.delete(:operator)
+ @left = Node::Statement.new(parsed.delete(:left))
+ @right = Node::Statement.new(parsed.delete(:right))
+ super(parsed)
end
def evaluate(**args)
- if operator == IF_KEYWORD
- right = @right.evaluate(**args)
+ if @operator == IF_KEYWORD
+ if @right.evaluate(**args).truthy?
+ @left.evaluate(**args)
+ else
+ ::Code::Object::Nothing.new
+ end
+ elsif @operator == UNLESS_KEYWORD
+ if @right.evaluate(**args).falsy?
+ @left.evaluate(**args)
+ else
+ ::Code::Object::Nothing.new
+ end
+ elsif @operator == WHILE_KEYWORD
+ last = ::Code::Object::Nothing.new
- right.truthy? ? @left.evaluate(**args) : ::Code::Object::Nothing.new
- elsif operator == UNLESS_KEYWORD
- right = @right.evaluate(**args)
+ last = @left.evaluate(**args) while @right.evaluate(**args).truthy?
- right.truthy? ? ::Code::Object::Nothing.new : @left.evaluate(**args)
- elsif operator == WHILE_KEYWORD
- left = ::Code::Object::Nothing.new
+ last
+ elsif @operator == UNTIL_KEYWORD
+ last = ::Code::Object::Nothing.new
- left = @left.evaluate(**args) while @right.evaluate(**args).truthy?
+ last = @left.evaluate(**args) while @right.evaluate(**args).falsy?
- left
- elsif operator == UNTIL_KEYWORD
- left = ::Code::Object::Nothing.new
-
- left = @left.evaluate(**args) until @right.evaluate(**args).truthy?
-
- left
+ last
else
- raise NotImplementedError.new(operator.inspect)
+ raise NotImplementedError.new(@operator)
end
- end
-
- private
-
- def operator
- @operator.to_sym
end
end
end
end