Nim 相当于 Python 的列表理解
Nim equivalent of Python's list comprehension
由于 Nim 与 Python 共享很多功能,如果它也实现 Python's list comprehension 我也不会感到惊讶:
string = "Hello 12345 World"
numbers = [x for x in string if x.isdigit()]
# ['1', '2', '3', '4', '5']
这在 Nim 中真的可行吗?如果没有,可以用 templates/macros ?
来实现
根据rosettacode, Nim has no list comprehensions, but they can be created through metaprogramming。
[编辑]
正如 bluenote10 所指出的,列表理解现在是 future module:
的一部分
import future
var str = "Hello 12345 World"
echo lc[x | (x <- str, ord(x) - ord('0') in 0..9), char]
上面的代码片段产生 @[1, 2, 3, 4, 5]
更新:自版本 0.19.9 起已弃用列表推导式 (Source). A good alternative is to use the new sugar.collect macro.
列表推导是在 sugar
package 中的 Nim 中实现的(即,您必须 import sugar
)。它被实现为一个名为 lc
的宏,并允许像这样编写列表理解:
lc[x | (x <- 1..10, x mod 2 == 0), int]
lc[(x,y,z) | (x <- 1..n, y <- x..n, z <- y..n, x*x + y*y == z*z), tuple[a,b,c: int]]
请注意,宏需要指定元素的类型。
import sugar
let items = collect(newSeq):
for x in @[1, 2, 3]: x * 2
echo items
输出@[2, 4, 6]
您代码的 Nim 翻译:
import sugar, strutils
var str = "Hello 12345 World"
echo collect(for s in str:
if s.isDigit(): s)
由于 Nim 与 Python 共享很多功能,如果它也实现 Python's list comprehension 我也不会感到惊讶:
string = "Hello 12345 World"
numbers = [x for x in string if x.isdigit()]
# ['1', '2', '3', '4', '5']
这在 Nim 中真的可行吗?如果没有,可以用 templates/macros ?
来实现根据rosettacode, Nim has no list comprehensions, but they can be created through metaprogramming。
[编辑]
正如 bluenote10 所指出的,列表理解现在是 future module:
的一部分import future
var str = "Hello 12345 World"
echo lc[x | (x <- str, ord(x) - ord('0') in 0..9), char]
上面的代码片段产生 @[1, 2, 3, 4, 5]
更新:自版本 0.19.9 起已弃用列表推导式 (Source). A good alternative is to use the new sugar.collect macro.
列表推导是在 sugar
package 中的 Nim 中实现的(即,您必须 import sugar
)。它被实现为一个名为 lc
的宏,并允许像这样编写列表理解:
lc[x | (x <- 1..10, x mod 2 == 0), int]
lc[(x,y,z) | (x <- 1..n, y <- x..n, z <- y..n, x*x + y*y == z*z), tuple[a,b,c: int]]
请注意,宏需要指定元素的类型。
import sugar
let items = collect(newSeq):
for x in @[1, 2, 3]: x * 2
echo items
输出@[2, 4, 6]
您代码的 Nim 翻译:
import sugar, strutils
var str = "Hello 12345 World"
echo collect(for s in str:
if s.isDigit(): s)