titer_issues.nim 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  1. discard """
  2. output: '''
  3. 0
  4. 1
  5. 2
  6. 3
  7. 4
  8. 1
  9. start
  10. false
  11. 0
  12. 1
  13. 2
  14. end
  15. @[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 18, 20, 21, 24, 27, 30, 36, 40, 42]
  16. 1002
  17. 0
  18. 1
  19. 2
  20. 7
  21. 9002
  22. 9004
  23. 9006
  24. 9008
  25. 9010
  26. 9012
  27. 9014
  28. 9016
  29. 9018
  30. @[1, 2]
  31. @[1, 2, 3]
  32. 1
  33. nested finally
  34. outer finally
  35. nested finally
  36. outer finally
  37. nested finally
  38. outer finally
  39. nested finally
  40. outer finally
  41. '''
  42. """
  43. import sequtils, strutils
  44. block t338:
  45. proc moo(): iterator (): int =
  46. iterator fooGen: int {.closure.} =
  47. while true:
  48. yield result
  49. result.inc
  50. return fooGen
  51. var foo = moo()
  52. for i in 0 .. 4:
  53. echo foo()
  54. block t8041:
  55. iterator xy[T](a: T, b: set[T]): T =
  56. if a in b:
  57. yield a
  58. for a in xy(1'i8, {}):
  59. for b in xy(a, {}):
  60. echo a
  61. block t3837_chained:
  62. iterator t1(): int {.closure.} =
  63. yield 1
  64. iterator t2(): int {.closure.} =
  65. for i in t1():
  66. yield i
  67. for i in t2():
  68. echo $i
  69. proc iter1(): (iterator: int) =
  70. let coll = [0,1,2]
  71. result = iterator: int {.closure.} =
  72. for i in coll:
  73. yield i
  74. proc iter2(it: (iterator: int)): (iterator: int) =
  75. result = iterator: int {.closure.} =
  76. echo finished(it)
  77. for i in it():
  78. yield i
  79. echo "start"
  80. let myiter1 = iter1()
  81. let myiter2 = iter2(myiter1)
  82. for i in myiter2():
  83. echo i
  84. echo "end"
  85. type Iterable[T] = (iterator: T) | Slice[T]
  86. ## Everything that can be iterated over, iterators and slices so far.
  87. proc toIter[T](s: Slice[T]): iterator: T =
  88. ## Iterate over a slice.
  89. iterator it: T {.closure.} =
  90. for x in s.a..s.b:
  91. yield x
  92. return it
  93. proc toIter[T](i: iterator: T): iterator: T =
  94. ## Nop
  95. i
  96. iterator map[T,S](i: Iterable[T], f: proc(x: T): S): S =
  97. let i = toIter(i)
  98. for x in i():
  99. yield f(x)
  100. proc filter[T](i: Iterable[T], f: proc(x: T): bool): iterator: T =
  101. let i = toIter(i)
  102. iterator it: T {.closure.} =
  103. for x in i():
  104. if f(x):
  105. yield x
  106. result = it
  107. iterator filter[T](i: Iterable[T], f: proc(x: T): bool): T =
  108. let i = toIter(i)
  109. for x in i():
  110. if f(x):
  111. yield x
  112. var it = toSeq(filter(2..10, proc(x: int): bool = x mod 2 == 0))
  113. doAssert it == @[2, 4, 6, 8, 10]
  114. it = toSeq(map(filter(2..10, proc(x: int): bool = x mod 2 == 0), proc(x: int): int = x * 2))
  115. doAssert it == @[4, 8, 12, 16, 20]
  116. block t3221_complex:
  117. iterator permutations[T](ys: openArray[T]): seq[T] =
  118. var
  119. d = 1
  120. c = newSeq[int](ys.len)
  121. xs = newSeq[T](ys.len)
  122. for i, y in ys: xs[i] = y
  123. yield xs
  124. block outer:
  125. while true:
  126. while d > 1:
  127. dec d
  128. c[d] = 0
  129. while c[d] >= d:
  130. inc d
  131. if d >= ys.len: break outer
  132. let i = if (d and 1) == 1: c[d] else: 0
  133. swap xs[i], xs[d]
  134. yield xs
  135. inc c[d]
  136. proc dig_vectors(): void =
  137. var v_nums: seq[int]
  138. v_nums = newSeq[int](1)
  139. for perm in permutations(toSeq(0 .. 1)):
  140. v_nums[0] = 1
  141. dig_vectors()
  142. block t3499_keepstate:
  143. proc slice[T](iter: iterator(): T {.closure.}, sl: auto): seq[T] =
  144. var res: seq[int64] = @[]
  145. var i = 0
  146. for n in iter():
  147. if i > sl.b:
  148. break
  149. if i >= sl.a:
  150. res.add(n)
  151. inc i
  152. res
  153. iterator harshad(): int64 {.closure.} =
  154. for n in 1 ..< int64.high:
  155. var sum = 0
  156. for ch in string($n):
  157. sum += parseInt("" & ch)
  158. if n mod sum == 0:
  159. yield n
  160. echo harshad.slice 0 ..< 20
  161. for n in harshad():
  162. if n > 1000:
  163. echo n
  164. break
  165. # bug #3499 last snippet fixed
  166. # bug #705 last snippet fixed
  167. block t1725_nested:
  168. iterator factory(): int {.closure.} =
  169. iterator bar(): int {.closure.} =
  170. yield 0
  171. yield 1
  172. yield 2
  173. for x in bar(): yield x
  174. for x in factory():
  175. echo x
  176. block t2023_objiter:
  177. type
  178. Obj = object
  179. iter: iterator (): int8 {.closure.}
  180. iterator test(): int8 {.closure.} =
  181. yield 7
  182. proc init():Obj=
  183. result.iter = test
  184. var o = init()
  185. echo(o.iter())
  186. block:
  187. # bug #13739
  188. iterator myIter(arg: openArray[int]): int =
  189. var tmp = 0
  190. let len = arg.len
  191. while tmp < len:
  192. yield arg[tmp] * 2
  193. inc tmp
  194. proc someProc() =
  195. var data = [4501,4502,4503,4504,4505,4506,4507,4508,4509]
  196. # StmtListExpr should not get special treatment.
  197. for x in myIter((discard;data)):
  198. echo x
  199. someProc()
  200. block:
  201. # bug #12576
  202. iterator ff(sq: varargs[seq[int]]): int =
  203. for x in sq:
  204. echo x
  205. for x in ff(@[1, 2], @[1, 2, 3]):
  206. echo x
  207. # bug #19575
  208. iterator bb() {.closure.} =
  209. while true:
  210. try: discard
  211. except: break
  212. finally: break
  213. var a = bb
  214. iterator cc() {.closure.} =
  215. while true:
  216. try: discard
  217. except:
  218. if true:
  219. break
  220. finally:
  221. if true:
  222. break
  223. var a2 = cc
  224. # bug #16876
  225. block:
  226. iterator a(num: int): int {.closure.} =
  227. if num == 1:
  228. yield num
  229. else:
  230. for i in a(num - 1):
  231. yield i
  232. for i in a(5):
  233. echo i
  234. block:
  235. # bug #19911 (return in nested try)
  236. # try yield -> try
  237. iterator p1: int {.closure.} =
  238. try:
  239. yield 0
  240. try:
  241. return
  242. finally:
  243. echo "nested finally"
  244. echo "shouldn't run"
  245. finally:
  246. echo "outer finally"
  247. echo "shouldn't run"
  248. for _ in p1():
  249. discard
  250. # try -> try yield
  251. iterator p2: int {.closure.} =
  252. try:
  253. try:
  254. yield 0
  255. return
  256. finally:
  257. echo "nested finally"
  258. echo "shouldn't run"
  259. finally:
  260. echo "outer finally"
  261. echo "shouldn't run"
  262. for _ in p2():
  263. discard
  264. # try yield -> try yield
  265. iterator p3: int {.closure.} =
  266. try:
  267. yield 0
  268. try:
  269. yield 0
  270. return
  271. finally:
  272. echo "nested finally"
  273. echo "shouldn't run"
  274. finally:
  275. echo "outer finally"
  276. echo "shouldn't run"
  277. for _ in p3():
  278. discard
  279. # try -> try
  280. iterator p4: int {.closure.} =
  281. try:
  282. try:
  283. return
  284. finally:
  285. echo "nested finally"
  286. echo "shouldn't run"
  287. finally:
  288. echo "outer finally"
  289. echo "shouldn't run"
  290. for _ in p4():
  291. discard