Как преобразовать фрагмент в последовательность?

Я хотел бы указать последовательность непосредственно из среза (вместо того, чтобы повторять срез и добавлять каждый элемент в последовательность по отдельности). Я пробовал несколько разных способов, но очевидные не работают.

var 
    x = newSeq(1..n)
    y: seq[int] = @[1..n]
    z: seq[int] = 1..n

Единственное, что мне удалось заставить работать, это импортировать списки из future

var x: seq[int] = lc[x | (x <- 1..n), int]

Я не могу найти в документах способ, которым это можно сделать, не связанный с импортом экспериментальных материалов из будущего или перегрузкой конструктора последовательности.


person Matt Smith    schedule 16.04.2015    source источник


Ответы (2)


https://nim-lang.org/docs/sequtils.html#toSeq.t,untyped

import sequtils
var x = toSeq 1..n

Для справки, вы также можете написать свою собственную реализацию для преобразования среза в последовательность:

proc toSeq2[T](s: Slice[T]): seq[T] =
  result = @[]
  for x in s.a .. s.b:
    result.add x
person def-    schedule 16.04.2015

Это будет иметь хорошую производительность для больших срезов, так как не будет перераспределения памяти:

proc sliceToSeq[T](s: Slice[T]): seq[T] =
  result = newSeq[T](ord(s.b) - ord(s.a) + 1)
  var i = 0
  for x in s.a .. s.b:
    result[i] = x
    inc(i)
person endragor    schedule 17.04.2015