mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-30 09:54:49 +00:00
83 lines
1.5 KiB
Nim
83 lines
1.5 KiB
Nim
discard """
|
|
output: '''
|
|
Selecting 2
|
|
1.0
|
|
Selecting 4
|
|
2.0
|
|
'''
|
|
"""
|
|
|
|
|
|
# bug #5522
|
|
import macros, sugar, sequtils
|
|
|
|
proc tryS(f: () -> void): void =
|
|
(try: f() except: discard)
|
|
|
|
template trySTImpl(body: untyped): untyped =
|
|
tryS do() -> auto:
|
|
`body`
|
|
|
|
macro tryST*(body: untyped): untyped =
|
|
var b = if body.kind == nnkDo: body[^1] else: body
|
|
result = quote do:
|
|
trySTImpl((block:
|
|
`b`
|
|
))
|
|
|
|
iterator testIt(): int {.closure.} =
|
|
for x in 0..10:
|
|
yield x
|
|
|
|
var xs = newSeq[int]()
|
|
proc test = tryST do:
|
|
for x in testIt():
|
|
xs.add(x)
|
|
|
|
test()
|
|
|
|
doAssert xs == toSeq(0..10)
|
|
|
|
|
|
|
|
# bug #5690
|
|
proc filter[T](it: (iterator : T), f: proc(x: T): bool): (iterator : T) =
|
|
return iterator (): T {.closure.} =
|
|
for x in it():
|
|
if f(x):
|
|
yield x
|
|
|
|
proc len[T](it : iterator : T) : Natural =
|
|
for i in it():
|
|
result += 1
|
|
|
|
proc simpleSeqIterator(s :seq[int]) : iterator : int =
|
|
iterator it: int {.closure.} =
|
|
for x in s:
|
|
yield x
|
|
result = it
|
|
|
|
let a = newSeq[int](99)
|
|
|
|
doAssert len(simpleSeqIterator(a).filter(proc(x : int) : bool = true)) == 99
|
|
|
|
|
|
|
|
# bug #5340
|
|
proc where[A](input: seq[A], filter: (A) -> bool): iterator (): A =
|
|
result = iterator (): A {.closure.} =
|
|
for item in input:
|
|
if filter(item):
|
|
yield item
|
|
|
|
proc select[A,B](input: iterator(): A {.closure.}, selector: (A) -> B): iterator (): B {.closure.} =
|
|
result = iterator (): B =
|
|
for item in input():
|
|
echo "Selecting " & $item
|
|
yield selector(item)
|
|
|
|
let query = @[1,2,3,4].where(x=>x mod 2==0).select((x)=>x/2)
|
|
|
|
for i in query():
|
|
echo $i
|