ForExpr
From Erights
(Difference between revisions)
(→Static constraints) |
(revert) |
||
(2 intermediate revisions not shown) | |||
Line 17: | Line 17: | ||
{{XXX|Define the expansion of ForExpr}} | {{XXX|Define the expansion of ForExpr}} | ||
- | + | == Static constraints == | |
+ | |||
+ | * <var>collection</var> may not use nouns bound by <var>optKeyPattern</var> or <var>valuePattern</var>, or vice versa. | ||
+ | |||
+ | == Tests == | ||
+ | |||
+ | The function provided to (the value of <var>collection</var>)'s [[:Category:Message iterate/1|iterate/1]] method throws if called after iterate/1 has returned. | ||
+ | |||
+ | ? var captured := null | ||
+ | ? def capturer { | ||
+ | > to iterate(f) :void { | ||
+ | > captured := f | ||
+ | > f("a", "b") | ||
+ | > } | ||
+ | > } | ||
+ | # value: <capturer> | ||
+ | |||
+ | ? for x => y in capturer { println(x, " -> ", y) } | ||
+ | # stdout: a -> b | ||
+ | # | ||
+ | |||
+ | ? captured("c", "d") | ||
+ | # problem: For-loop body isn't valid after for-loop exits. | ||
+ | |||
+ | The return value of iterate/1 is not the return value of the for loop; the loop returns [[null]] unless a return value is given by [[__break]]. | ||
+ | |||
+ | ? def confuser extends [1,2,3] { | ||
+ | > to iterate(f) { | ||
+ | > super.iterate(f) | ||
+ | > return __Portrayal | ||
+ | > } | ||
+ | > } | ||
+ | # value: <confuser> | ||
+ | |||
+ | ? def optKeyOf(collection, toFind) { | ||
+ | > return for key => val in collection { | ||
+ | > if (val == toFind) { | ||
+ | > break key | ||
+ | > } | ||
+ | > } | ||
+ | > } | ||
+ | |||
+ | ? optKeyOf(confuser, 1) | ||
+ | # value: 0 | ||
+ | |||
+ | ? [optKeyOf(confuser, 43)] | ||
+ | # value: [null] | ||
+ | |||
+ | |||
+ | [[Category:E language specification]] | ||
+ | [[Category:Nonkernel-E nodes]] |
Latest revision as of 18:44, 20 April 2011
ForExpr is a nonkernel node which executes code for each element in a collection or other object implementing iterate/1.
"for" (optKeyPattern "=>")? valuePattern "in" collection "{" body "}" ({optBreakCatch an EMatcher}: "catch" pattern "{" expr "}")?
XXX We need to formalize the grammar definitions used in our spec
Contents |
Fields
- optKeyPattern :nullOk[Pattern]
- valuePattern :Pattern
- collection :nullOk[EExpr]
- body :EExpr
- optBreakCatch :nullOk[EMatcher]
Expansion
XXX Define the expansion of ForExpr
Static constraints
- collection may not use nouns bound by optKeyPattern or valuePattern, or vice versa.
Tests
The function provided to (the value of collection)'s iterate/1 method throws if called after iterate/1 has returned.
? var captured := null ? def capturer { > to iterate(f) :void { > captured := f > f("a", "b") > } > } # value: <capturer> ? for x => y in capturer { println(x, " -> ", y) } # stdout: a -> b # ? captured("c", "d") # problem: For-loop body isn't valid after for-loop exits.
The return value of iterate/1 is not the return value of the for loop; the loop returns null unless a return value is given by __break.
? def confuser extends [1,2,3] { > to iterate(f) { > super.iterate(f) > return __Portrayal > } > } # value: <confuser> ? def optKeyOf(collection, toFind) { > return for key => val in collection { > if (val == toFind) { > break key > } > } > } ? optKeyOf(confuser, 1) # value: 0 ? [optKeyOf(confuser, 43)] # value: [null]