       guardPart = if @raw then '' else
         idt + "if (!#{ utility 'hasProp' }.call(#{svar}, #{ivar})) continue;\n"
     else
-      vars   += ', ' + step if step isnt pvar
+      pvar  or= 1
+      vars   += ', ' + step if step and (step isnt pvar)
       defPart = @tab + sourcePart + ';\n' if svar isnt sourcePart
-      forPart = vars + "; #{cond}; " + ivar + switch +pvar
+      forPart = vars + "; #{cond}; " + (incr or (ivar + switch +pvar
         when  1 then '++'
         when -1 then '--'
         else (if pvar < 0 then ' -= ' + pvar.slice 1 else ' += ' + pvar)
+      ))
     body    = Closure.wrap(body, yes) if hasCode
     varPart = idt + namePart + ';\n' if namePart
     defPart += @pluckDirectCall o, body, name, index unless @pattern

      scope.find(index, yes) if index
    [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 or @object and not @raw
        [sourcePart, svar] = @source.compileLoopReference o, 'ref'

      throw SyntaxError 'index cannot be a pattern matching expression'
    extend this, head
    @body    = Expressions.wrap [body]
    @pattern = @name instanceof Value
    @returns = false

