1discard """ 2 output: '''0 31 42 53 64 75 86 97 108 119 1210 135 5 147 7 159 9 160 170 180 190 201 212 2270 230 24''' 25""" 26 27when true: 28 proc main() = 29 let 30 lo=0 31 hi=10 32 33 iterator itA(): int = 34 for x in lo..hi: 35 yield x 36 37 for x in itA(): 38 echo x 39 40 var y: int 41 42 iterator itB(): int = 43 while y <= hi: 44 yield y 45 inc y 46 47 y = 5 48 for x in itB(): 49 echo x, " ", y 50 inc y 51 52 main() 53 54 55iterator infinite(): int {.closure.} = 56 var i = 0 57 while true: 58 yield i 59 inc i 60 61iterator take[T](it: iterator (): T, numToTake: int): T {.closure.} = 62 var i = 0 63 for x in it(): 64 if i >= numToTake: 65 break 66 yield x 67 inc i 68 69# gives wrong reasult (3 times 0) 70for x in infinite.take(3): 71 echo x 72 73# does what we want 74let inf = infinite 75for x in inf.take(3): 76 echo x 77 78# bug #3583 79proc foo(f: (iterator(): int)) = 80 for i in f(): echo i 81 82let fIt = iterator(): int = yield 70 83foo fIt 84 85# bug #5321 86 87proc lineIter*(filename: string): iterator(): string = 88 result = iterator(): string {.closure.} = 89 for line in lines(filename): 90 yield line 91 92proc unused = 93 var count = 0 94 let iter = lineIter("temp10.nim") 95 for line in iter(): 96 count += 1 97 98iterator lineIter2*(filename: string): string {.closure.} = 99 var f = open(filename, bufSize=8000) 100 defer: close(f) # <-- commenting defer "solves" the problem 101 var res = newStringOfCap(80) 102 while f.readLine(res): yield res 103 104proc unusedB = 105 var count = 0 106 for line in lineIter2("temp10.nim"): 107 count += 1 108 109# bug #5519 110import os, algorithm 111 112iterator filesIt(path: string): auto {.closure.} = 113 var files = newSeq[string]() 114 var dirs = newSeq[string]() 115 for k, p in os.walkDir(path): 116 let (_, n, e) = p.splitFile 117 if e != "": 118 continue 119 case k 120 of pcFile, pcLinkToFile: 121 files.add(n) 122 else: 123 dirs.add(n) 124 files.sort(system.cmp) 125 dirs.sort(system.cmp) 126 for f in files: 127 yield f 128 129 for d in dirs: 130 files = newSeq[string]() 131 for k, p in os.walkDir(path / d): 132 let (_, n, e) = p.splitFile 133 if e != "": 134 continue 135 case k 136 of pcFile, pcLinkToFile: 137 files.add(n) 138 else: 139 discard 140 files.sort(system.cmp) 141 let prefix = path.splitPath[1] 142 for f in files: 143 yield prefix / f 144 145# bug #13815 146var love = iterator: int {.closure.} = 147 yield cast[type( 148 block: 149 var a = 0 150 yield a 151 a)](0) 152 153for i in love(): 154 echo i 155