module Sol

  class MacroExpression < CallStatement

    def initialize(name , arguments )
      super(name , SelfExpression.new , arguments)
    end

    def to_slot(compiler)
      parts = name.to_s.split("_")
      class_name = "SlotMachine::#{parts.collect{|s| s.capitalize}.join}"
      # Hmm, slightly open issue how to pass args from sol to macro
      # WIP, hack for comparison
      args = arguments.collect {|arg|
        case arg
        when Sol::SymbolConstant
          arg.value
        when Sol::IntegerConstant
          arg.value
        when Sol::LocalVariable
          arg.name
        else
          puts "unhandled #{arg}:#{arg.class}"
          arg
        end
      }
      eval(class_name).new( self , *args)
    end

    # When used as right hand side, this tells what data to move to get the result into
    # a varaible. It is (off course) the return value of the message
    def to_slotted(_)
      SlotMachine::Slotted.for(:message ,[ :return_value])
    end

    def to_s(depth = 0)
      sen = "X.#{name}(#{@arguments.collect{|a| a.to_s}.join(', ')})"
      at_depth(depth , sen)
    end

  end
end