Sha256: 3e15df609c44e8426e85c74cd5ebcd4bd14afa0952f0f398b983694ddc71e7bf

Contents?: true

Size: 1.5 KB

Versions: 3

Compression:

Stored size: 1.5 KB

Contents

# pops the top 2 items from the +:code+ stack;
# pushes a new +:code+ item containing a block obtained by concatenating the other listings
#
# note: the top stack item (the "attachment") is concatenated _into_ the second popped item (the "receiver")
#
# If both items are already blocks, the new block is their concatenation;
# if the receiver is a block and the attachment isn't, the attachment is appended to the receiver;
# if the receiver is not a block, then a _surrounding_ block is constructed that contains both, in order.
#
# For example:
#   [a, b] + [1,2,3] -> [a,b,1,2,3]
#   [a,b] + 1 -> [a,b,1]
#   a + [1,2,3] -> [a,[1,2,3]]
#   a + 1 -> [a,1]
#
# *needs:* 2 +:code+
#
# *pushes:* 1 +:code+
#

class CodeConcatenateInstruction < Instruction
  def preconditions?
    needs :code, 2
  end
  def setup
    @arg2 = @context.pop_value(:code)
    @arg1 = @context.pop_value(:code)
  end
  def derive
    t1 = NudgeProgram.new(@arg1)
    t2 = NudgeProgram.new(@arg2)
    if t1.parses? && t2.parses?
      if t1.linked_code.kind_of?(CodeblockPoint)
        if t2.linked_code.kind_of?(CodeblockPoint)
          new_tree = t1[1].contents + t2[1].contents
        else
          new_tree = t1[1].contents << t2.linked_code
        end
      else
        new_tree = [t1.linked_code, t2.linked_code]
      end
      listed = CodeblockPoint.new(new_tree).blueprint
      @result = ValuePoint.new("code", listed)
    else
      @result = ValuePoint.new("code", "block {}")
    end
  end
  def cleanup
    pushes :code, @result
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
nudge-0.2.9 lib/instructions/code/code_concatenate.rb
nudge-0.2.8 lib/instructions/code/code_concatenate.rb
nudge-0.2.7 lib/instructions/code/code_concatenate.rb