mirror of
https://github.com/jashkenas/coffeescript.git
synced 2026-02-17 19:11:22 -05:00
while loops can now be used as expressions -- they return an array containing the computed result of each iteration.
This commit is contained in:
@@ -15,8 +15,8 @@ dc.model.Document: dc.Model.extend({
|
|||||||
# document by binding to Metadata, instead of on-the-fly.
|
# document by binding to Metadata, instead of on-the-fly.
|
||||||
metadata: =>
|
metadata: =>
|
||||||
docId: this.id
|
docId: this.id
|
||||||
_.select(Metadata.models(), (meta =>
|
_.select(Metadata.models(), (meta =>
|
||||||
_.any(meta.get('instances'), instance =>
|
_.any(meta.get('instances'), instance =>
|
||||||
instance.document_id is docId)))
|
instance.document_id is docId)))
|
||||||
|
|
||||||
bookmark: pageNumber =>
|
bookmark: pageNumber =>
|
||||||
@@ -60,7 +60,7 @@ dc.model.DocumentSet: dc.model.RESTfulSet.extend({
|
|||||||
# change their selected state.
|
# change their selected state.
|
||||||
_onModelEvent: e, model =>
|
_onModelEvent: e, model =>
|
||||||
this.base(e, model)
|
this.base(e, model)
|
||||||
fire: e == dc.Model.CHANGED and model.hasChanged('selected')
|
fire: e is dc.Model.CHANGED and model.hasChanged('selected')
|
||||||
if fire then _.defer(_(this.fire).bind(this, this.SELECTION_CHANGED, this))
|
if fire then _.defer(_(this.fire).bind(this, this.SELECTION_CHANGED, this))
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -353,6 +353,7 @@ rule
|
|||||||
While:
|
While:
|
||||||
WHILE Expression Block { result = WhileNode.new(val[1], val[2]) }
|
WHILE Expression Block { result = WhileNode.new(val[1], val[2]) }
|
||||||
| WHILE Expression { result = WhileNode.new(val[1], nil) }
|
| WHILE Expression { result = WhileNode.new(val[1], nil) }
|
||||||
|
| Expression WHILE Expression { result = WhileNode.new(val[2], Expressions.wrap(val[0])) }
|
||||||
;
|
;
|
||||||
|
|
||||||
# Array comprehensions, including guard and current index.
|
# Array comprehensions, including guard and current index.
|
||||||
|
|||||||
@@ -36,9 +36,9 @@ module CoffeeScript
|
|||||||
def compile(o={})
|
def compile(o={})
|
||||||
@options = o.dup
|
@options = o.dup
|
||||||
@indent = o[:indent]
|
@indent = o[:indent]
|
||||||
top = self.is_a?(ForNode) ? @options[:top] : @options.delete(:top)
|
top = self.top_sensitive? ? @options[:top] : @options.delete(:top)
|
||||||
closure = statement? && !statement_only? && !top && !@options[:return]
|
closure = statement? && !statement_only? && !top && !@options[:return]
|
||||||
closure ? compile_closure(@options) : compile_node(@options)
|
closure ? compile_closure(@options) : compile_node(@options)
|
||||||
end
|
end
|
||||||
|
|
||||||
def compile_closure(o={})
|
def compile_closure(o={})
|
||||||
@@ -56,6 +56,7 @@ module CoffeeScript
|
|||||||
def unwrap; self; end
|
def unwrap; self; end
|
||||||
def statement?; false; end
|
def statement?; false; end
|
||||||
def statement_only?; false; end
|
def statement_only?; false; end
|
||||||
|
def top_sensitive?; false; end
|
||||||
end
|
end
|
||||||
|
|
||||||
# A collection of nodes, each one representing an expression.
|
# A collection of nodes, each one representing an expression.
|
||||||
@@ -668,14 +669,27 @@ module CoffeeScript
|
|||||||
@condition, @body = condition, body
|
@condition, @body = condition, body
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def top_sensitive?
|
||||||
|
true
|
||||||
|
end
|
||||||
|
|
||||||
def compile_node(o)
|
def compile_node(o)
|
||||||
returns = o.delete(:return)
|
returns = o.delete(:return)
|
||||||
|
top = o.delete(:top) && !returns
|
||||||
o[:indent] = idt(1)
|
o[:indent] = idt(1)
|
||||||
o[:top] = true
|
o[:top] = true
|
||||||
cond = @condition.compile(o)
|
cond = @condition.compile(o)
|
||||||
post = returns ? "\n#{idt}return null;" : ''
|
set = ''
|
||||||
return write("#{idt}while (#{cond}) null;#{post}") if @body.nil?
|
if !top
|
||||||
write("#{idt}while (#{cond}) {\n#{@body.compile(o)}\n#{idt}}#{post}")
|
rvar = o[:scope].free_variable
|
||||||
|
set = "#{idt}#{rvar} = [];\n"
|
||||||
|
@body = Expressions.wrap(CallNode.new(
|
||||||
|
ValueNode.new(LiteralNode.new(rvar), [AccessorNode.new('push')]), [@body.unwrap]
|
||||||
|
))
|
||||||
|
end
|
||||||
|
post = returns ? "\n#{idt}return #{rvar};" : ''
|
||||||
|
return write("#{set}#{idt}while (#{cond}) null;#{post}") if @body.nil?
|
||||||
|
write("#{set}#{idt}while (#{cond}) {\n#{@body.compile(o)}\n#{idt}}#{post}")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -697,6 +711,10 @@ module CoffeeScript
|
|||||||
@name, @index = @index, @name if @object
|
@name, @index = @index, @name if @object
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def top_sensitive?
|
||||||
|
true
|
||||||
|
end
|
||||||
|
|
||||||
def compile_node(o)
|
def compile_node(o)
|
||||||
top_level = o.delete(:top) && !o[:return]
|
top_level = o.delete(:top) && !o[:return]
|
||||||
range = @source.is_a?(ValueNode) && @source.base.is_a?(RangeNode) && @source.properties.empty?
|
range = @source.is_a?(ValueNode) && @source.base.is_a?(RangeNode) && @source.properties.empty?
|
||||||
|
|||||||
@@ -26,4 +26,4 @@ func: =>
|
|||||||
|
|
||||||
c.single: c.list[1..1][0]
|
c.single: c.list[1..1][0]
|
||||||
|
|
||||||
print(func() == '-')
|
print(func() is '-')
|
||||||
|
|||||||
17
test/fixtures/execution/test_while.coffee
vendored
Normal file
17
test/fixtures/execution/test_while.coffee
vendored
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
i: 100
|
||||||
|
while i -= 1
|
||||||
|
|
||||||
|
print(i is 0)
|
||||||
|
|
||||||
|
|
||||||
|
i: 5
|
||||||
|
list: while i -= 1
|
||||||
|
i * 2
|
||||||
|
|
||||||
|
print(list.join(' ') is "8 6 4 2")
|
||||||
|
|
||||||
|
|
||||||
|
i: 5
|
||||||
|
list: (i * 3 while i -= 1)
|
||||||
|
|
||||||
|
print(list.join(' ') is "12 9 6 3")
|
||||||
Reference in New Issue
Block a user