Каждый параметр в Nim является неизменяемым, если только он не объявлен как параметр var.
Это означает, что следующий код не компилируется:
proc resetPointsToOrigin(points: seq[Point]) =
for i in 0 ..< points.len: # 1
points[i] = Point(x: 0, y: 0) # 2
..<. Символ ..< указывает на то, что верхняя граница является исключительной, а это именно то, что нам нужно, поскольку индексация начинается с 0.points[i] и присвоить ему новое значение — Point(x: 0, y: 0). Но компилятор отклоняет это выражение!Компилятор отклоняет этот код, поскольку points — это параметр, который можно использовать только для чтения. Это ограничение помогает нам писать более понятный код, который лучше масштабируется для больших программ, и в то же время помогает компилятору генерировать более качественный машинный код.
Чтобы иметь возможность изменять точки, нам нужен параметр var:
proc resetPointsToOrigin(points: var seq[Point]) = # 1
for i in 0 ..< points.len:
points[i] = Point(x: 0, y: 0) # 2
points — это изменяемая последовательность переменныхЕсли теперь попробовать вызвать resetPointsToOrigin с помощью конструктора seq, компилятор снова отклонит наш код:
resetPointsToOrigin @[Point(x: 2, y: 4)]
Причина в том, что последовательность, созданная с помощью @[], неизменяема. Переменная с параметром var может быть изменена, поэтому следующий код допустим:
var points = @[Point(x: 2, y: 4)]
resetPointsToOrigin points