Allowing pattern matching within for..loops

This commit is contained in:
Stan Angeloff
2010-04-26 21:35:35 +03:00
parent 2d1abd099d
commit 2a3a713811
6 changed files with 152 additions and 88 deletions

View File

@@ -1079,8 +1079,10 @@ exports.ForNode: class ForNode extends BaseNode
@step: source.step
@object: !!source.object
[@name, @index]: [@index, @name] if @object
@pattern: @name instanceof ValueNode
throw new Error('index cannot be a pattern matching expression') if @index instanceof ObjectNode
@children: compact [@body, @source, @filter]
@returns: false
@returns: false
top_sensitive: ->
true
@@ -1104,7 +1106,7 @@ exports.ForNode: class ForNode extends BaseNode
scope: o.scope
name: @name and @name.compile o
index: @index and @index.compile o
scope.find name if name
scope.find name if name and not @pattern
scope.find index if index
body_dent: @idt 1
rvar: scope.free_variable() unless top_level
@@ -1120,7 +1122,11 @@ exports.ForNode: class ForNode extends BaseNode
svar: scope.free_variable()
index_var: null
source_part: "$svar = ${ @source.compile(o) };\n$@tab"
var_part: "$body_dent$name = $svar[$ivar];\n" if name
var_part: "$body_dent$name = $svar[$ivar];\n" if name and not @pattern
if @pattern
o.indent: @idt 1
o.top: true
var_part: new AssignNode(@name, literal("$svar[$ivar]")).compile(o) + "\n"
if not @object
lvar: scope.free_variable()
step_part: if @step then "$ivar += ${ @step.compile(o) }" else "$ivar++"