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