def descriptor( hash )
      hash = hash.merge @index1 => ( ( hash.values.max || 0 ) + 1 )
      hash = hash.merge @index2 => ( ( hash.values.max || 0 ) + 1 )
      hash = hash.merge @var1 => ( ( hash.values.max || 0 ) + 1 )
      hash = hash.merge @var2 => ( ( hash.values.max || 0 ) + 1 )
      "Diagonal(#{@value.descriptor( hash )},#{@index0.descriptor( hash )}," +
        "#{@index1.descriptor( hash )},#{@index2.descriptor( hash )}," +
        "#{@initial ? @initial.descriptor( hash ) : 'nil'}," +
        "#{@block.descriptor( hash )})"
    end
def descriptor( hash )
      hash = hash.merge @index1 => ( ( hash.values.max || 0 ) + 1 )
      hash = hash.merge @index2 => ( ( hash.values.max || 0 ) + 1 )
      hash = hash.merge @var1 => ( ( hash.values.max || 0 ) + 1 )
      hash = hash.merge @var2 => ( ( hash.values.max || 0 ) + 1 )
      "Diagonal(#{@value.descriptor( hash )},#{@index0.descriptor( hash )}," +
        "#{@index1.descriptor( hash )},#{@index2.descriptor( hash )}," +
        "#{@initial ? @initial.descriptor( hash ) : 'nil'}," +
        "#{@block.descriptor( hash )})"
    end
Constructor

 @param [Node] value Initial value of injection.
 @param [Node] index0 Index to select starting point of injection.
 @param [Node] index1 Index to diagonally iterate over +value+.
 @param [Node] index2 Index to diagonally iterate over +value+.
 @param [Node,NilClass] initial Initial value for injection.
 @param [Node] block Expression with body of injection.
 @param [Variable] var1 Variable for performing substitutions on body of
        injection.
 @param [Variable] var2 Variable for performing substitutions on body of
        injection.

 @private
 Get unique descriptor of this object

 @param [Hash] hash Labels for any variables.

 @return [String] Descriptor of this object,

 @private