       body.push     lastLine
       o.indent    = @idt 1
       body        = Expressions.wrap [new Literal body.compile o]
-      body.push     new Assign new Literal(index), new Literal ivar if index
-      body.push     new Assign new Literal(name), new Literal nvar or ivar if name
+      body.push     new Assign @index, new Literal ivar if index
+      body.push     new Assign @name, new Literal nvar or ivar if name
     else
       varPart     = "#{idt1}#{namePart};\n" if namePart
       if forPart and name is ivar

    @object = !!source.object
    [@name, @index] = [@index, @name] if @object
    throw SyntaxError 'index cannot be a pattern matching expression' if @index instanceof Value
    @pattern = @name instanceof Value
    @returns = false

  makeReturn: ->

  # some cannot.
  compileNode: (o) ->
    topLevel      = del(o, 'top') and not @returns
    source        = if @range then @source.base else @source
    codeInBody    = not @body.containsPureStatement() and @body.contains (node) -> node instanceof Code
    scope         = o.scope
    name          = @name  and @name.compile o
    index         = @index and @index.compile o
    scope.find(name,  immediate: yes) if name and not @pattern and (@range or not codeInBody)
    scope.find(index, immediate: yes) if index
    rvar          = scope.freeVariable 'result' unless topLevel
    ivar          = if @range then name else index
    ivar          = scope.freeVariable 'i' if not ivar or codeInBody
    nvar          = scope.freeVariable 'i' if name and not @range and codeInBody
    varPart       = ''
    guardPart     = ''
    unstepPart    = ''
    body          = Expressions.wrap [@body]
    idt1          = @idt 1
    if @range
      forPart = source.compile merge o, {index: ivar, @step}
    else
      svar = sourcePart = @source.compile o
