     name    = not @pattern and @name?.compile o
     index   = @index?.compile o
     ivar    = if not index then scope.freeVariable 'i' else index
-    varPart = ''
+    varPart = guardPart = defPart = retPart = ''
     body    = Expressions.wrap [@body]
     idt     = @idt 1
     scope.find(name,  immediate: yes) if name

    [step, pvar] = @step.compileLoopReference o, 'step' if @step
    if @from
      [tail, tvar] = @to.compileLoopReference o, 'to'
      vars  = "#{ivar} = #{ @from.compile o }"
      vars += ", #{tail}" if tail isnt tvar
      cond = if +pvar
        "#{ivar} #{ if pvar < 0 then '>' else '<' }= #{tvar}"
      else
        "#{pvar} < 0 ? #{ivar} >= #{tvar} : #{ivar} <= #{tvar}"
    else
      if name
        [sourcePart, svar] = @source.compileLoopReference o, 'ref'
      else
        sourcePart = svar = @source.compile o, LVL_PAREN

          lvar = scope.freeVariable 'len'
          vars = "#{ivar} = 0, #{lvar} = #{svar}.length"
          cond = "#{ivar} < #{lvar}"
    if @object
      forPart   = ivar + ' in ' + sourcePart
      guardPart = if @raw then '' else
        idt + "if (!#{ utility 'hasProp' }.call(#{svar}, #{ivar})) continue;\n"
    else
      vars   += ', ' + step if step isnt pvar
      defPart = @tab + sourcePart + ';\n' if svar isnt sourcePart
      forPart = vars + "; #{cond}; " + ivar + switch +pvar
        when  1 then '++'
        when -1 then '--'
        else (if pvar < 0 then ' -= ' + pvar.slice 1 else ' += ' + pvar)
    if o.level > LVL_TOP or @returns
      rvar     = scope.freeVariable 'result'
      defPart += @tab + rvar + ' = [];\n'
      retPart  = @compileReturnValue rvar, o
      body     = Push.wrap rvar, body
    body     = Expressions.wrap [new If @guard, body] if @guard
    varPart  = idt + namePart + ';\n' if namePart
    o.indent = idt
    defPart + """
    #{@tab}for (#{forPart}) {
    #{ guardPart or '' }#{varPart}#{ body.compile o, LVL_TOP }
    #{@tab}}
    """ + retPart

#### Switch

