41 lines
911 B
Nim
41 lines
911 B
Nim
discard """
|
|
output: "02468101214161820\n15"
|
|
"""
|
|
|
|
proc filter[T](list: seq[T], f: proc (item: T): bool {.closure.}): seq[T] =
|
|
result = @[]
|
|
for i in items(list):
|
|
if f(i):
|
|
result.add(i)
|
|
|
|
let nums = @[0, 1, 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
|
|
|
|
when true:
|
|
let nums2 = filter(nums,
|
|
(proc (item: int): bool =
|
|
result = (item mod 2) == 0)
|
|
)
|
|
|
|
proc outer =
|
|
# lets use a proper closure this time:
|
|
var modulo = 2
|
|
let nums2 = filter(nums,
|
|
(proc (item: int): bool = result = (item mod modulo) == 0)
|
|
)
|
|
|
|
for n in nums2: stdout.write(n)
|
|
stdout.write("\n")
|
|
|
|
outer()
|
|
|
|
import math
|
|
proc compose[T](f1, f2: proc (x: T): T {.closure.}): proc (x: T): T {.closure.} =
|
|
result = (proc (x: T): T =
|
|
result = f1(f2(x)))
|
|
|
|
|
|
proc add5(x: int): int = result = x + 5
|
|
|
|
var test = compose(add5, add5)
|
|
echo test(5)
|
|
|