part of the way to supporting multiline array comprehensions -- the grammar and parsing is there -- the code generation is tricky

This commit is contained in:
Jeremy Ashkenas
2009-12-27 21:50:02 -08:00
parent ac00a19514
commit aa45456d7d
3 changed files with 13 additions and 5 deletions

View File

@@ -321,7 +321,9 @@ rule
# Looks a little confusing, check nodes.rb for the arguments to ForNode. # Looks a little confusing, check nodes.rb for the arguments to ForNode.
For: For:
Expression FOR Expression FOR
ForVariables ForSource { result = ForNode.new(val[0], val[3][0], val[2][0], val[3][1], val[2][1]) } ForVariables ForSource "." { result = ForNode.new(val[0], val[3][0], val[2][0], val[3][1], val[2][1]) }
| FOR ForVariables ForSource
Terminator Expressions "." { result = ForNode.new(val[4], val[2][0], val[1][0], val[2][1], val[1][1]) }
; ;
# An array comprehension has variables for the current element and index. # An array comprehension has variables for the current element and index.
@@ -332,9 +334,9 @@ rule
# The source of the array comprehension can optionally be filtered. # The source of the array comprehension can optionally be filtered.
ForSource: ForSource:
IN PureExpression "." { result = [val[1]] } IN PureExpression { result = [val[1]] }
| IN PureExpression | IN PureExpression
IF Expression "." { result = [val[1], val[3]] } IF Expression { result = [val[1], val[3]] }
; ;
# Switch/When blocks. # Switch/When blocks.

View File

@@ -571,6 +571,8 @@ module CoffeeScript
if o[:return] || o[:assign] if o[:return] || o[:assign]
return_result = "#{o[:assign].compile(o)} = #{return_result}" if o[:assign] return_result = "#{o[:assign].compile(o)} = #{return_result}" if o[:assign]
return_result = "return #{return_result}" if o[:return] return_result = "return #{return_result}" if o[:return]
o.delete(:assign)
o.delete(:return)
if @filter if @filter
body = CallNode.new(ValueNode.new(LiteralNode.new(rvar), [AccessorNode.new('push')]), [@body]) body = CallNode.new(ValueNode.new(LiteralNode.new(rvar), [AccessorNode.new('push')]), [@body])
body = IfNode.new(@filter, body, nil, :statement => true) body = IfNode.new(@filter, body, nil, :statement => true)

View File

@@ -1,4 +1,8 @@
nums: n * n for n in [1, 2, 3] if n % 2 isnt 0. nums: n * n for n in [1, 2, 3] if n % 2 isnt 0.
result: n * 2 for n in nums. results: n * 2 for n in nums.
print(result.join(',') is '2,18') # next: for n in [1, 2, 3] if n % 2 isnt 0
# print('hi') if false
# n * n * 2.
print(results.join(',') is '2,18')