19

由于 Nim 与 Python 共享很多特性,如果它也实现了Python 的列表推导,我不会感到惊讶:

string = "Hello 12345 World"
numbers = [x for x in string if x.isdigit()]
# ['1', '2', '3', '4', '5']

这在 Nim 中真的可能吗?如果没有,可以用模板/宏来实现吗?

4

4 回答 4

19

更新:列表理解自 0.19.9 版(来源)以来已被弃用。一个不错的选择是使用新的 sugar.collect 宏


列表理解是在sugar中的 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]]

请注意,宏需要指定元素的类型。

于 2015-04-27T12:55:20.277 回答
8

According to rosettacode, Nim has no list comprehensions, but they can be created through metaprogramming.

[EDIT]

As pointed out by bluenote10, list comprehensions are now part of the future module:

import future
var str = "Hello 12345 World"
echo lc[x | (x <- str, ord(x) - ord('0') in 0..9),  char]

The above snippet yields @[1, 2, 3, 4, 5]

于 2015-04-27T12:36:28.447 回答
5
import sugar

let items = collect(newSeq):
  for x in @[1, 2, 3]: x * 2

echo items

输出@[2, 4, 6]

于 2020-10-16T21:42:54.947 回答
1

您的代码的 Nim 翻译:

import sugar, strutils
var str = "Hello 12345 World"
echo collect(for s in str:
  if s.isDigit(): s)
于 2021-11-03T07:54:13.177 回答