🏑 tutorial.nim

Π£Ρ‡Π΅Π±Π½ΠΎΠ΅ пособиС ΠΏΠΎ языку Nim (Π§Π°ΡΡ‚ΡŒ I)

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

"Der Mensch ist doch ein Augentier -- SchΓΆne Dinge wΓΌnsch' ich mir."

(Π¦ΠΈΡ‚Π°Ρ‚Π° ΠΈΠ· пСсни Β«MorgensternΒ» Π³Ρ€ΡƒΠΏΠΏΡ‹ Β«RammsteinΒ». ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄: «Но Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ – глазастый Π·Π²Π΅Ρ€ΡŒ. МнС Π½ΡƒΠΆΠ½ΠΎ мноТСство красивых Π²Π΅Ρ‰Π΅ΠΉΒ».)

Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ являСтся ΡƒΡ‡Π΅Π±Π½ΠΈΠΊΠΎΠΌ ΠΏΠΎ языку программирования Nim.

Π­Ρ‚ΠΎΡ‚ ΡƒΡ‡Π΅Π±Π½ΠΈΠΊ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π·Π½Π°ΠΊΠΎΠΌΡ‹ с Π±Π°Π·ΠΎΠ²Ρ‹ΠΌΠΈ концСпциями программирования - ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ, Ρ‚ΠΈΠΏΠ°ΠΌΠΈ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ.

Π’ΠΎΡ‚ нСсколько Π΄Ρ€ΡƒΠ³ΠΈΡ… рСсурсов для изучСния Nim (Π½Π° английском языкС):

ВсС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎΠ΄Π° Π² этом ΡƒΡ‡Π΅Π±Π½ΠΈΠΊΠ΅, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΠΉΠ΄Π΅Π½Ρ‹ Π² ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Nim, ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ руководству ΠΏΠΎ ΡΡ‚ΠΈΠ»ΡŽ языка Nim.

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅:

  1. Ввоя пСрвая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°
  2. ЛСксичСскиС Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹
  3. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ var
  4. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ let
  5. ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Ρ‹
  6. Команда присваивания
  7. ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ управлСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ
  8. ΠžΠ±Π»Π°ΡΡ‚ΠΈ видимости ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° block
  9. ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈ отступы
  10. ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹
  11. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹
  12. Π˜Ρ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹
  13. Π‘Π°Π·ΠΎΠ²Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹
  14. Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ прСдставлСниС Ρ‚ΠΈΠΏΠΎΠ²
  15. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹
  16. ΠœΠΎΠ΄ΡƒΠ»ΠΈ


Ввоя пСрвая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°


Начнём с ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ "Hello World":

# это ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ
echo "Как тСбя Π·ΠΎΠ²ΡƒΡ‚? "
var name: string = readLine(stdin)
echo "ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ", name, "!"

Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚Π΅ этот ΠΊΠΎΠ΄ Π² Ρ„Π°ΠΉΠ» greetings.nim. Π’Π΅ΠΏΠ΅Ρ€ΡŒ скомпилируйтС ΠΈ запуститС Π΅Π³ΠΎ:

$ nim compile --run greetings.nim

Π‘ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ --run Nim автоматичСски выполняСт Ρ„Π°ΠΉΠ» послС Π΅Π³ΠΎ компиляции. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, Π΄ΠΎΠ±Π°Π²ΠΈΠ² ΠΈΡ… послС ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π°:

$ nim compile --run greetings.nim Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚1 Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚2

Π£ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ Π΅ΡΡ‚ΡŒ сокращСния, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· этих Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ²:

$ nim c greetings.nim # ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈ сохраняСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΏΠ°ΠΏΠΊΡƒ
$ nim c -r greetings.nim # ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΏΠ°ΠΏΠΊΡƒ ΠΈ запускаСт Π΅Ρ‘

Eсли Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π½ΠΎ исполняСмый Ρ„Π°ΠΉΠ» Π½Π΅ Π½ΡƒΠΆΠ΅Π½ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ запускС тСстов ΠΈ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΡ… скриптов) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅:

$ nim r greetings.nim # ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² ΡΠΈΡΡ‚Π΅ΠΌΠ½ΡƒΡŽ кСш ΠΏΠ°ΠΏΠΊΡƒ ΠΈ запускаСт Π΅Ρ‘

ВсС доступныС ΠΊΠΎΠΌΠΌΠ°Π½Π΄Ρ‹, ΠΊΠ»ΡŽΡ‡ΠΈ ΠΈ сокращСния ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² Π²Ρ‹Π²ΠΎΠ΄Π΅ ΠΊΠΎΠΌΠΌΠ°Π½Π΄Ρ‹:

$ nim --fullhelp

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Nim ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠ΄ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ (debug), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ Ρ€Π΅Π»ΠΈΠ·Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ - ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠ»ΡŽΡ‡ -d:release, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ:

$ nim compile -d:release --run greetings.nim

Для Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠΈΠ½Π³Π° ΠΈ ΠΊΠΎΠ΄Π° Π² ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠ»ΡŽΡ‡ -d:release. Для сравнСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ с "нСбСзопасными" языками, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ C, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΡŒ -d:danger, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡ΠΈΠΌΡ‹Π΅, сопоставимыС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Nim ΠΊΠΎΠ΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°ΠΌΠΈ выполнСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π°ΠΆΠ΅ Π½Π΅ доступны для C.

Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ наша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ довольно ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Π½ΠΎ я объясню синтаксис: ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, написанныС Π±Π΅Π· отступа, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ стартС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Nim Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ отступов. ΠžΡ‚ΡΡ‚ΡƒΠΏΡ‹ Π΄Π΅Π»Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΠ±Π΅Π»Π°ΠΌΠΈ, табуляция Π½Π΅ допускаСтся.

Π‘Ρ‚Ρ€ΠΎΠΊΠΎΠ²Ρ‹Π΅ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ ΠΎΠ±Ρ€Π°ΠΌΠ»ΡΡŽΡ‚ΡΡ Π΄Π²ΠΎΠΉΠ½Ρ‹ΠΌΠΈ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°ΠΌΠΈ. Команда var ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ Π½ΠΎΠ²ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ с ΠΈΠΌΠ΅Π½Π΅ΠΌ name ΠΈ Ρ‚ΠΈΠΏΠΎΠΌ string, послС Ρ‡Π΅Π³ΠΎ Π΅ΠΉ присваиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²Π΅Ρ€Π½ΡƒΠ»Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° readLine. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ компилятор Π·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ readLine Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ строку, Ρ‚ΠΈΠΏ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ (это называСтся Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ Π²Ρ‹Π²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΈΠΏΠΎΠ²). ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ:

var name = readLine(stdin)

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ – это ΠΏΠΎΡ‡Ρ‚ΠΈ СдинствСнная Ρ„ΠΎΡ€ΠΌΠ° вывСдСния Ρ‚ΠΈΠΏΠΎΠ², ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ Π² Nim: это Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ компромисс ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΡ€Π°Ρ‚ΠΊΠΎΡΡ‚ΡŒΡŽ ΠΈ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒΡŽ.

Наша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° "hello world" содСрТит Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΆΠ΅ извСстны компилятору: echo, readLine ΠΈ Ρ‚.Π΄. Π­Ρ‚ΠΈ встроСнныС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ std/system, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ нСявно импортируСтся Π»ΡŽΠ±Ρ‹ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ. ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈΠ· этого модуля всСгда доступны.


ЛСксичСскиС Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹


Рассмотрим лСксичСскиС элСмСнты Nim ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅. Как ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ языки программирования, Nim состоит ΠΈΠ· Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΎΠ², ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ², ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов, ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π², ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΈ Π·Π½Π°ΠΊΠΎΠ² ΠΏΡƒΠ½ΠΊΡ‚ΡƒΠ°Ρ†ΠΈΠΈ.


Π‘Ρ‚Ρ€ΠΎΠΊΠΎΠ²Ρ‹Π΅ ΠΈ ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹


Π‘Ρ‚Ρ€ΠΎΠΊΠΎΠ²Ρ‹Π΅ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ Π·Π°ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ Π² Π΄Π²ΠΎΠΉΠ½Ρ‹Π΅ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ "; ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ – Π² ΠΎΠ΄ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ '. Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ символы ΡΠΊΡ€Π°Π½ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΌ слэшСм \; \n ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ строки, \t – Ρ‚Π°Π±ΡƒΠ»ΡΡ†ΠΈΡŽ ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

Π’Π°ΠΊΠΆΠ΅ Π±Ρ‹Π²Π°ΡŽΡ‚ сырыС (raw) строковыС Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹:

r"C:\program files\nim"

Π’ сырых Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π°Ρ… ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ слэш Π½Π΅ являСтся ΡΠΊΡ€Π°Π½ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ символом.

Π’Ρ€Π΅Ρ‚ΠΈΠΉ ΠΈ послСдний способ записи строковых Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΎΠ², это Π΄Π»ΠΈΠ½Π½Ρ‹Π΅ строковыС Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹. Они ΠΎΠ±Ρ€Π°ΠΌΠ»ΡΡŽΡ‚ΡΡ Ρ‚Ρ€ΠΎΠΉΠ½Ρ‹ΠΌΠΈ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°ΠΌΠΈ: """...""", ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ строки, ΠΈ \ Π² Π½ΠΈΡ… Π½Π΅ являСтся ΡΠΊΡ€Π°Π½ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ символом. Они ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² ΠΊΠΎΠ΄ HTML-Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ².


ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ


ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π³Π΄Π΅ ΡƒΠ³ΠΎΠ΄Π½ΠΎ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ строкового ΠΈΠ»ΠΈ символьного Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π° ΠΈ начинаСтся с символа Ρ€Π΅ΡˆΡ‘Ρ‚ΠΊΠΈ #. Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с ##:

# ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ.
var myVariable: int ## Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΠΊΠ΅Π½Π°ΠΌΠΈ, входят Π² синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ ΠΈ, поэтому, ΠΌΠΎΠ³ΡƒΡ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… мСстах Ρ„Π°ΠΉΠ»Π°! Π­Ρ‚ΠΎ позволяСт ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

ΠœΠ½ΠΎΠ³ΠΎΡΡ‚Ρ€ΠΎΡ‡Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с #[ ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‚ΡΡ ]#. ΠœΠ½ΠΎΠ³ΠΎΡΡ‚Ρ€ΠΎΡ‡Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ:

##[ ΠœΠ½ΠΎΠ³ΠΎΡΡ‚Ρ€ΠΎΡ‡Π½Ρ‹ΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ ]##
#[
  Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ любой тСкст Π²Π½ΡƒΡ‚Ρ€ΠΈ этого Π±Π»ΠΎΠΊΠ°
  Π±Π΅Π· ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ отступам.
     yes("МоТно Π»ΠΈ Π·Π°Π΄Π°Ρ‚ΡŒ бСссмыслСнный вопрос?")
  #[
     Π—Π°ΠΌΠ΅Ρ‚ΠΊΠ°: этот ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ!
  ]#
]#
discard """Π‘Ρ‚Π°Ρ€Ρ‹ΠΉ ΡΡ‚ΠΈΠ»ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π², Π½Π΅ рСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ."""


Числа


ЧислСнныС Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ ΠΏΠΈΡˆΡƒΡ‚ΡΡ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ Π΄Ρ€ΡƒΠ³ΠΈΡ… языков. Для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ Ρ‡ΠΈΡ‚Π°Π±Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ Ρ€Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒ разряды подчёркиваниями: 1_000_000 (ΠΎΠ΄ΠΈΠ½ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½).

Числа, содСрТащиС Ρ‚ΠΎΡ‡ΠΊΡƒ (ΠΈΠ»ΠΈ e, ΠΈΠ»ΠΈ E) ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π°ΠΌΠΈ чисСл с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой: 1.0e9 (ΠΎΠ΄ΠΈΠ½ ΠΌΠΈΠ»Π»ΠΈΠ°Ρ€Π΄).

ШСстнадцатСричныС Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с прСфикса 0x, Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Π΅ – с 0b, Π° Π²ΠΎΡΡŒΠΌΠ΅Ρ€ΠΈΡ‡Π½Ρ‹Π΅ – с 0o. Π’Π΅Π΄ΡƒΡ‰ΠΈΠΉ ноль Π±Π΅Π· 'ΠΎ' Π½Π΅ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ число Π² Π²ΠΎΡΡŒΠΌΠ΅Ρ€ΠΈΡ‡Π½ΠΎΠ΅.


ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ var


Команда var ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ Π½ΠΎΠ²ΡƒΡŽ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ»ΠΈ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ:

var x, y: int # ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ x ΠΈ y, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ Ρ‚ΠΈΠΏ `int`


ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ let


Команда let Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΠΊΠ°ΠΊ var, Π½ΠΎ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠ³ΠΎ присваивания: послС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ:

let x = "abc" # Π²Π²ΠΎΠ΄ΠΈΡ‚ Π½ΠΎΠ²ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ `x` ΠΈ присваиваСт Π΅ΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
x = "xyz"     # Π½Π΅ сработаСт: Π²Ρ‚ΠΎΡ€ΠΎΠ΅ присваиваниС `x`

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ отступов послС ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Ρ†Π΅Π»ΡƒΡŽ ΡΠ΅ΠΊΡ†ΠΈΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ констант:

let # Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ `var` ΠΈ `const`
  x, y: int
  # здСсь Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ
  m, n, o: string


ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Ρ‹


ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Ρ‹ - это символы, связанныС со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ константы Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ. Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² объявлСнии константы обязано Π±Ρ‹Ρ‚ΡŒ вычисляСмым Π½Π° этапС компиляции! :

var a = 5
const
  x = "abc" # константа x содСрТит строку "abc"
  b = 1
  c = b + 5 # Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ вычислСния извСстСн Π½Π° этапС компиляции
  d = a + 3 # Π½Π΅ сработаСт: Π½Π° этапС компиляции Π½Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…

Π Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ let ΠΈ const ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅: let Π²Π²ΠΎΠ΄ΠΈΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, которая Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ пСрСприсвоСна, Π° const ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Β«ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Π²ΠΎ врСмя компиляции ΠΈ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² ΡΠ΅ΠΊΡ†ΠΈΡŽ Π΄Π°Π½Π½Ρ‹Ρ…Β»:

const input = readLine(stdin) # Ошибка: прСдполагаСтся константноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅
let input = readLine(stdin)   # Π° это сработаСт


Команда присваивания


Команда присваивания Π·Π°Π΄Π°Π΅Ρ‚ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ, Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС, мСсту хранСния:

var x = "abc" # Π²Π²ΠΎΠ΄ΠΈΡ‚ Π½ΠΎΠ²ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ `x` ΠΈ присваиваСт Π΅ΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
x = "xyz"     # присваиваСт Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ `x`

= - это ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания.

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ = нСльзя ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ, ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈΠ»ΠΈ Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒ, Π½ΠΎ это ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒΡΡ Π² Π±ΡƒΠ΄ΡƒΡ‰ΠΈΡ… вСрсиях Nim.

Π’ ΠΎΠ΄Π½ΠΎΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ присваивания ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ нСсколько ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… β€” всС ΠΎΠ½ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:

var x, y = 3 # присваиваСт ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ `x` ΠΈ `y` Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 3
echo "x ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ", x
echo "y ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ", y
x = 42       # измСняСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ `x` Π½Π° 42, Π½Π΅ мСняя `y`
echo "x ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ", x
echo "y ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ", y
x ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 3
y ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 3
x ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 42
y ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 3


ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ управлСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ


ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° привСтствия содСрТит Ρ‚Ρ€ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ.

Но Ρ‚Π°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΌΠΎΠ³ΡƒΡ‚ лишь самыС ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π±ΠΎΠ»Π΅Π΅ слоТным Π½ΡƒΠΆΠ½Ρ‹ Π΅Ρ‰Ρ‘ Ρ†ΠΈΠΊΠ»Ρ‹ ΠΈ вСтвлСния.


Команда if


Команда if – ΠΎΠ΄ΠΈΠ½ ΠΈΠ· способов ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π΅Ρ‚Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° выполнСния:

let name = readLine(stdin)
if name == "":
  echo "БСдняга, Ρ‚Ρ‹ потСрял своё имя?"
elif name == "имя":
  echo "ΠžΡ‡Π΅Π½ΡŒ смСшно, тСбя Π·ΠΎΠ²ΡƒΡ‚ имя."
else:
  echo "ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ", name, "!"

Π’Π΅Ρ‚ΠΎΠΊ elif ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ноль ΠΈ Π±ΠΎΠ»Π΅Π΅, Π²Π΅Ρ‚ΠΊΠ° else Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°.

ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово elif являСтся сокращСниСм else if, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΠ·Π»ΠΈΡˆΠ½ΠΈΡ… отступов. ("" это пустая строка, ΠΎΠ½Π° Π½Π΅ содСрТит символов.)


Команда case


Π”Ρ€ΡƒΠ³ΠΎΠΉ способ вСтвлСния рСализуСтся ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ case. Она раздСляСт ΠΏΠΎΡ‚ΠΎΠΊ выполнСния Π½Π° нСсколько Π²Π΅Ρ‚ΠΎΠΊ:

let name = readLine(stdin)
case name
of "":
  echo "БСдняга, Ρ‚Ρ‹ потСрял своё имя?"
of "name":
  echo "ΠžΡ‡Π΅Π½ΡŒ смСшно, тСбя Π·ΠΎΠ²ΡƒΡ‚ имя."
of "Dave", "Frank":
  echo "ΠšΡ€ΡƒΡ‚ΠΎΠ΅ имя!"
else:
  echo "ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ", name, "!"

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° для of ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ список Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Ρ€Π°Π·Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… запятыми.

Команда case ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Ρ†Π΅Π»Ρ‹ΠΌΠΈ числами, Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ пСрСчислимыми Ρ‚ΠΈΠΏΠ°ΠΌΠΈ ΠΈ строками. (Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ пСрСчислимыС Ρ‚ΠΈΠΏΡ‹ Π±ΡƒΠ΄Π΅Ρ‚ рассказано ΠΏΠΎΠ·ΠΆΠ΅.) Для Ρ†Π΅Π»Ρ‹Ρ… чисСл ΠΈ пСрСчислимых Ρ‚ΠΈΠΏΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ‹ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ:

# этa ΠΊΠΎΠΌΠ°Π½Π΄a Π±ΡƒΠ΄Π΅Ρ‚ объяснСна ΠΏΠΎΠ·ΠΆΠ΅:
from strutils import parseInt

echo("Назови число: ")
let n = parseInt(readLine(stdin))
case n
of 0..2, 4..7: echo("Π­Ρ‚ΠΎ число ΠΈΠ· мноТСства: {0, 1, 2, 4, 5, 6, 7}")
of 3, 8: echo("Π­Ρ‚ΠΎ число Π»ΠΈΠ±ΠΎ 3, Π»ΠΈΠ±ΠΎ 8")

Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, ΠΊΠΎΠ΄ Π²Ρ‹ΡˆΠ΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½Π°Π΄ΠΎ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΡŒ всС значСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ n, Π° ΠΊΠΎΠ΄ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ значСния 0..8.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ, Π½Π΅ слишком ΠΏΡ€Π°ΠΊΡ‚ΠΈΡ‡Π½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Ρ†Π΅Π»Ρ‹Π΅ числа (хотя Ρ‚Π°ΠΊΠΎΠ΅ ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, благодаря Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ²), ΠΌΡ‹ исправим это, ΡƒΠΊΠ°Π·Π°Π² компилятору, Ρ‡Ρ‚ΠΎ для всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π½ΠΈΡ‡Π΅Π³ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ:

case n
of 0..2, 4..7: echo("Π­Ρ‚ΠΎ число ΠΈΠ· мноТСства: {0, 1, 2, 4, 5, 6, 7}")
of 3, 8: echo("Π­Ρ‚ΠΎ число Π»ΠΈΠ±ΠΎ 3, Π»ΠΈΠ±ΠΎ 8")
else: discard

ΠŸΡƒΡΡ‚Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° discard это ΠΊΠΎΠΌΠ°Π½Π΄Π° Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°Ρ‚ΡŒ.

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Π·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° case с сСкциСй else ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ ΠΈ, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ,ошибка исчСзаСт. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ всС строковыС значСния ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΡŒ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ: Π²ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π² случаС строк, Π²Π΅Ρ‚ΠΊΠ° else ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°.

Π’ Ρ†Π΅Π»ΠΎΠΌ, ΠΊΠΎΠΌΠ°Π½Π΄Π° case ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ² Ρ‚ΠΈΠΏΠΎΠ² ΠΈ пСрСчислСний. Π’ΠΎ Ρ‡Ρ‚ΠΎ компилятор провСряСт ΠΎΡ…Π²Π°Ρ‚ всСх Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ - ΠΎΡ‡Π΅Π½ΡŒ полСзная Π²Π΅Ρ‰ΡŒ.


Команда while


Команда while прСдставляСт собой простой Ρ†ΠΈΠΊΠ»:

echo "Как тСбя Π·ΠΎΠ²ΡƒΡ‚? "
var name = readLine(stdin)
while name == "":
  echo "ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, Π½Π°Π·ΠΎΠ²ΠΈ своё имя: "
  name = readLine(stdin) # `var` отсутствуСт, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ
                         # здСсь Π½Π΅ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ новая пСрСмСнная

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, Ρ†ΠΈΠΊΠ» while использован, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π΅Π³ΠΎ имя Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΎΠ½ Π½Π΅ Π½Π°ΠΆΠΌΡ‘Ρ‚ Enter (Ρ‚.Π΅. Π½Π΅ Π²Π²Π΅Π΄Ρ‘Ρ‚ ΠΏΡƒΡΡ‚ΡƒΡŽ строку).


Команда for


Команда for Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Ρ†ΠΈΠΊΠ» ΠΏΠΎ всСм элСмСнтам ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования встроСнного ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° countup:

echo "Π‘Ρ‡ΠΈΡ‚Π°Π΅ΠΌ Π΄ΠΎ 5: "
for i in countup(1, 5):
  echo i
Π‘Ρ‡ΠΈΡ‚Π°Π΅ΠΌ Π΄ΠΎ 5: 
1
2
3
4
5

ВстроСнный ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ $ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Ρ†Π΅Π»ΠΎΠ΅ число (int) ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ Π² строку.

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ i нСявно ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ Ρ†ΠΈΠΊΠ»ΠΎΠΌ for ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ int, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ countup Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΠΌΠ΅Π½Π½ΠΎ этот Ρ‚ΠΈΠΏ. i ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎ значСниям 1, 2, .., 5.

КаТдоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ выводится с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ echo. Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ Π΄Π΅Π»Π°Π΅Ρ‚ Ρ‚ΠΎ ΠΆΠ΅ самоС:

echo "Π‘Ρ‡ΠΈΡ‚Π°Π΅ΠΌ Π΄ΠΎ 5: "
var i = 1
while i <= 5:
  echo i
  inc i # ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ i Π½Π° 1
Π‘Ρ‡ΠΈΡ‚Π°Π΅ΠΌ Π΄ΠΎ 5: 
1
2
3
4
5

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ отсчёт с ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ часто Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ…, Π² Nim Ρ‚Π°ΠΊΠΆΠ΅ Π΅ΡΡ‚ΡŒ .. ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄Π΅Π»Π°Π΅Ρ‚ Ρ‚ΠΎΠΆΠ΅ самоС Ρ‡Ρ‚ΠΎ ΠΈ countup:

for i in 1 .. 5:
  echo i

ΠžΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ отсчёт рСализуСтся ΡΡ‚ΠΎΠ»ΡŒ ΠΆΠ΅ просто (хотя ΠΎΠ½ Π½Π΅ Ρ‚Π°ΠΊ часто Π½ΡƒΠΆΠ΅Π½):

echo "Π‘Ρ‡ΠΈΡ‚Π°Π΅ΠΌ ΠΎΡ‚ 5 Π΄ΠΎ 1: "
for i in countdown(5, 1):
  echo i
Π‘Ρ‡ΠΈΡ‚Π°Π΅ΠΌ ΠΎΡ‚ 5 Π΄ΠΎ 1: 
5
4
3
2
1

0-индСксированный счёт ΠΈΠΌΠ΅Π΅Ρ‚ 2 ΡƒΠ΄ΠΎΠ±Π½Ρ‹Ρ… сокращСния ..< ΠΈ .. ^1 (ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ индСкса) Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ счёт Π΄ΠΎ индСкса Π½Π° ΠΎΠ΄ΠΈΠ½ мСньшС Ρ‡Π΅ΠΌ Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ ΠΏΡ€Π΅Π΄Π΅Π»:

for i in 0 ..< 3: # Ρ‚ΠΎ ΠΆΠ΅ самоС Ρ‡Ρ‚ΠΎ ΠΈ 0 .. 2
  echo i
0
1
2
var s = "Hello"
for i in 0 ..< s.len:
  echo i
0
1
2
3
4
var s = "Hello"
for idx, c in s[0 .. ^1]: # ^1 это послСдний элСмСнт, ^2 - прСдпослСдний, ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅
  echo idx, ": ", c
0: H
1: e
2: l
3: l
4: o

Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹e ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ для ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΉ (Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ массивы ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ): * items and mitems, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ нСизмСняСмыС ΠΈ измСняСмыС элСмСнты * соотвСтствСнно, ΠΈ * pairs and mpairs ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ индСкс ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта ΠΈ сам элСмСнт * (нСизмСняСмыС ΠΈ измСняСмыС, соотвСтствСнно)

for index, item in ["a","b"].pairs:
  echo item, " Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ", index
a Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 0
b Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 1


ΠžΠ±Π»Π°ΡΡ‚ΠΈ видимости ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° block


Π£ ΠΊΠΎΠΌΠ°Π½Π΄ управлСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ Π΅ΡΡ‚ΡŒ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΠΊΠ° Π½Π΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ: ΠΎΠ½ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ Π½ΠΎΠ²ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ x нСдоступна Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ Ρ†ΠΈΠΊΠ»Π°:

while false:
  var x = "hi"
echo(x) # Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

Команда while создаёт нСявный Π±Π»ΠΎΠΊ. Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ Π²ΠΈΠ΄ΠΈΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ‚ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹. ΠšΠΎΠΌΠ°Π½Π΄Ρƒ block ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ Π±Π»ΠΎΠΊ явно:

block myblock:
  var x = "hi"
echo(x) # Ρ‚ΠΎΠΆΠ΅ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

ΠœΠ΅Ρ‚ΠΊΠ° Π±Π»ΠΎΠΊΠ° (myblock Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅) Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°.


Команда break


Из Π±Π»ΠΎΠΊΠ° ΠΌΠΎΠΆΠ½ΠΎ досрочно Π²Ρ‹ΠΉΡ‚ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ break. Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ while, for ΠΈΠ»ΠΈ block. Она Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· блиТайшСй Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ конструкции, Ссли Π½Π΅ Π·Π°Π΄Π°Π½Π° ΠΌΠ΅Ρ‚ΠΊΠ° Π±Π»ΠΎΠΊΠ°, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½Π°Π΄ΠΎ Π²Ρ‹ΠΉΡ‚ΠΈ:

block myblock:
  echo "Π²Ρ…ΠΎΠ΄ΠΈΠΌ Π² Π±Π»ΠΎΠΊ"
  while true:
    echo "Ρ†ΠΈΠΊΠ»"
    break # ΠΏΠΎΠΊΠΈΠ΄Π°Π΅ΠΌ Ρ†ΠΈΠΊΠ», Π½ΠΎ Π½Π΅ Π±Π»ΠΎΠΊ
  echo "ΠΌΡ‹ всё Π΅Ρ‰Ρ‘ Π² Π±Π»ΠΎΠΊΠ΅"
echo "ΡƒΠΆΠ΅ Π²Π½Π΅ Π±Π»ΠΎΠΊΠ°"
Π²Ρ…ΠΎΠ΄ΠΈΠΌ Π² Π±Π»ΠΎΠΊ
Ρ†ΠΈΠΊΠ»
ΠΌΡ‹ всё Π΅Ρ‰Ρ‘ Π² Π±Π»ΠΎΠΊΠ΅
ΡƒΠΆΠ΅ Π²Π½Π΅ Π±Π»ΠΎΠΊΠ°
block myblock2:
  echo "Π²Ρ…ΠΎΠ΄ΠΈΠΌ Π² Π±Π»ΠΎΠΊ"
  while true:
    echo "Ρ†ΠΈΠΊΠ»"
    break myblock2 # ΠΏΠΎΠΊΠΈΠ΄Π°Π΅ΠΌ Π½Π°Π·Π²Π°Π½Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ (ΠΈ Ρ†ΠΈΠΊΠ»)
  echo "ΠΌΡ‹ всё Π΅Ρ‰Ρ‘ Π² Π±Π»ΠΎΠΊΠ΅"
echo "ΡƒΠΆΠ΅ Π²Π½Π΅ Π±Π»ΠΎΠΊΠ°"
Π²Ρ…ΠΎΠ΄ΠΈΠΌ Π² Π±Π»ΠΎΠΊ
Ρ†ΠΈΠΊΠ»
ΡƒΠΆΠ΅ Π²Π½Π΅ Π±Π»ΠΎΠΊΠ°


Команда continue


Как ΠΈ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… языках программирования, ΠΊΠΎΠΌΠ°Π½Π΄Π° continue Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ:

for i in 1 .. 5:
  if i <= 3: continue
  echo i
4
5


Команда when


ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

when system.hostOS == "windows":
  echo("это Windows ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€!")
elif system.hostOS == "linux":
  echo("это Linux ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€!")
elif system.hostOS == "macosx":
  echo("это Mac OS X!")
else:
  echo("нСизвСстная опСрационная систСма")

Команда when ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π΅ if, Π½ΠΎ Π΅ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ различия:

Команда when ΠΏΠΎΠ»Π΅Π·Π½Π° для написания ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½ΠΎ-зависимого ΠΊΠΎΠ΄Π°, ΠΏΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ с конструкциСй #ifdef языка C.


ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈ отступы


Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ рассмотрСли Π±Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ управлСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ вСрнёмся ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ отступов Nim.

Π’ Nim Π΅ΡΡ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ простыми ΠΈ слоТными ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ:

ΠŸΡ€ΠΎΡΡ‚Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ присваиваниС, Π²Ρ‹Π·ΠΎΠ² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° return, Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΊΠΎΠΌΠ°Π½Π΄.

Π‘Π»ΠΎΠΆΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ if, when, for, while ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ нСоднозначности слоТныС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ всСгда ΠΏΠΈΡˆΡƒΡ‚ΡΡ с отступом, Π° простыС – Π½Π΅Ρ‚:

var x, y = true

# для ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠ³ΠΎ присваивания отступ Π½Π΅ Π½ΡƒΠΆΠ΅Π½:"
if x: x = false

# Π½ΡƒΠΆΠ΅Π½ отступ для Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ if:
if x:
  if y:
    y = false
  else:
    y = true

# Π½ΡƒΠΆΠ΅Π½ отступ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π΄Π²Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ΡƒΡΠ»ΠΎΠ²ΠΈΡŽ:
if x:
  x = false
  y = false

Части ΠΊΠΎΠΌΠ°Π½Π΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π΄Π°ΡŽΡ‚ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π½Π΅ΠΊΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ выраТСниями. Для ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ читаСмости ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ отступы Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… мСстах:

if thisIsaLongCondition() and
    thisIsAnotherLongCondition(1,
       2, 3, 4):
  x = true

Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, отступы Π² выраТСниях, Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹ послС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², послС открытия скобок ΠΈ послС запятых.

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ скобок ΠΈ Ρ‚ΠΎΡ‡Π΅ΠΊ с запятой (;) Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Ρ‚Π°ΠΌ, Π³Π΄Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ выраТСния:

# вычисляСм fac(4) Π½Π° этапС компиляции:
const fac4 = (var x = 1; for i in 1..4: x *= i; x)
echo "Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π» числа 4 Ρ€Π°Π²Π΅Π½ ", fac4
Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π» числа 4 Ρ€Π°Π²Π΅Π½ 24


ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹


Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ echo ΠΈ readLine ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ², Π½Π°ΠΌ понадобятся ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹. (Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… языках ΠΎΠ½ΠΈ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ ΠΈΠ»ΠΈ функциями.) Π’ Nim Π½ΠΎΠ²Ρ‹Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова proc:

proc yes(question: string): bool =
  echo(question, " (Π΄/Π½)")
  while true:
    case readLine(stdin)
    of "Π΄", "Π”", "Π΄Π°", "Π”Π°": return true
    of "Π½", "Н", "Π½Π΅Ρ‚", "НСт": return false
    else: echo("ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, Π±ΡƒΠ΄ΡŒΡ‚Π΅ яснСС: Π΄Π° ΠΈΠ»ΠΈ Π½Π΅Ρ‚?")

if yes("Π£Π΄Π°Π»ΠΈΡ‚ΡŒ всС Π²Π°ΠΆΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅?"):
  echo("Извини, Π”Π΅ΠΉΠ², я боюсь, я Π½Π΅ ΠΌΠΎΠ³Ρƒ этого ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ.")
else:
  echo("Π― Π΄ΡƒΠΌΠ°ΡŽ Ρ‚Ρ‹ знаСшь Π² Ρ‡Π΅ΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π½Π΅ Ρ…ΡƒΠΆΠ΅ мСня.")

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ yes, которая Π·Π°Π΄Π°Ρ‘Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ вопрос ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true, Ссли ΠΎΠ½ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΠ» Β«Π”Π°Β», ΠΈ false, Ссли ΠΎΠ½ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΠ» «НСт».

Команда return ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠΌΡƒ Π²Ρ‹Ρ…ΠΎΠ΄Ρƒ ΠΈΠ· ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ (ΠΈ, соотвСтствСнно, Ρ†ΠΈΠΊΠ»Π° while).

Бинтаксис (question: string): bool ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ с ΠΈΠΌΠ΅Π½Π΅ΠΌ question, Ρ‚ΠΈΠΏΠΎΠΌ string ΠΈ Π²Π΅Ρ€Π½Ρ‘Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° bool.

bool это встроСнный Ρ‚ΠΈΠΏ, СдинствСнныС значСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, это true ΠΈ false. Условия Π² ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ… if ΠΈΠ»ΠΈ while Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΈΠΏ bool.

НСмного Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠ»ΠΎΠ³ΠΈΠΈ: Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, question Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ называСтся ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ, Π° "Π£Π΄Π°Π»ΠΈΡ‚ΡŒ всС..." – это Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ пСрСдаётся Π² этому ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ.


ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ result


Π’ любой ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π΅ΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, нСявно ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ пСрСмСнная result, которая прСдставляСт собой Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

Команда return Π±Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² это просто сокращСниС для return result.

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ result всСгда возвращаСтся ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΈΠ· ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹, Π΄Π°ΠΆΠ΅ Ссли ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ return Π½Π΅ Π±Ρ‹Π»ΠΎ.

proc sumTillNegative(x: varargs[int]): int =
  for i in x:
    if i < 0:
      return
    result = result + i

echo sumTillNegative() # Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ 0
echo sumTillNegative(3, 4, 5) # Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ 12
echo sumTillNegative(3, 4 , -1 , 6) # Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ 7

На ΠΌΠΎΠΌΠ΅Π½Ρ‚ старта Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ пСрСмСнная result всСгда ΡƒΠΆΠ΅ объявлСна, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ Π΅Ρ‘ снова, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ var result, ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ Π΅Ρ‘ Π·Π°Ρ‚Π΅Π½Π΅Π½ΠΈΡŽ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ с Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ.

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ result всСгда инициализируСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для своСго Ρ‚ΠΈΠΏΠ°. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ссылочныС Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ nil, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΈΡ…, ΠΏΡ€ΠΈ нСобходимости, придётся ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ.

ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ return ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΡƒΡŽ result ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ - Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ своСго послСднСго выраТСния. НапримСр, эта ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°:

proc helloWorld(): string =
  "Hello, World!"

Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ строку "Hello, World!":

echo helloWorld()
Hello, World!


ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹


Π’ Ρ‚Π΅Π»Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ константами. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡ… нСльзя ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ, это Π΄Π°Ρ‘Ρ‚ компилятору Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ эффСктивным способом.

Если Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Π½ΡƒΠΆΠ½Π° измСняСмая пСрСмСнная, Π΅Ρ‘ слСдуСт ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ Π² Ρ‚Π΅Π»Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ var. Π—Π°Ρ‚Π΅Π½Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈ являСтся ΠΈΠ΄ΠΈΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½Ρ‹ΠΌ:

proc printSeq(s: seq, nprinted: int = -1) =
  var nprinted = if nprinted == -1: s.len else: min(nprinted, s.len)
  for i in 0 .. <nprinted:
    echo s[i]

Если ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π²Ρ‹Π·Π²Π°Π²ΡˆΠ΅ΠΌΡƒ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ var ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€:

proc divmod(a, b: int; res, remainder: var int) =
  res = a div b        # цСлочислСнноС Π΄Π΅Π»Π΅Π½ΠΈΠ΅
  remainder = a mod b  # цСлочислСнноС взятиС остатка

var
  x, y: int
echo "Π΄ΠΎ:    x = ", x, "; y = ", y
divmod(8, 5, x, y) # ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ x ΠΈ y
echo "послС: x = ", x, "; y = ", y
Π΄ΠΎ:    x = 0; y = 0
послС: x = 1; y = 3

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, res ΠΈ remainder ΡΠ²Π»ΡΡŽΡ‚ΡΡ var ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ. Π’Π°ΠΊΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ΠΎΠΉ ΠΈ измСнСния станут Π²ΠΈΠ΄ΠΈΠΌΡ‹ Π²Ρ‹Π·Π²Π°Π²ΡˆΠ΅ΠΌΡƒ.

ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅ вмСсто var ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π»ΡƒΡ‡ΡˆΠ΅ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΊΠΎΡ€Ρ‚Π΅ΠΆ (tuple).


Команда discard


Π’ Nim нСльзя просто ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Ρ‘Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π§Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΡƒΡŽ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΈ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π΅Ρ‘ Π²Ρ‹Π·ΠΎΠ²Π°, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ discard:

discard yes("МоТно ΠΌΠ½Π΅ Π·Π°Π΄Π°Ρ‚ΡŒ бСсполСзный вопрос?")

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Ρ‘Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ нСявно, Ссли вызываСмая ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ΠΈΠ»ΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π±Ρ‹Π»ΠΈ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ с ΠΏΡ€Π°Π³ΠΌΠΎΠΉ discardable:

proc p(x, y: int): int {.discardable.} =
  return x + y

p(3, 4) # Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚


Π˜ΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹


Π‘Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρƒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Π² ΠΊΠ°ΠΊΠΎΠΌ порядкС ΠΎΠ½ΠΈ ΠΈΠ΄ΡƒΡ‚. Π­Ρ‚ΠΎ особСнно Π²Π΅Ρ€Π½ΠΎ для ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡ‚ слоТныС Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…. Π’ Ρ‚Π°ΠΊΠΈΡ… случаях Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Π»ΠΎ понятнСС, ΠΊΠ°ΠΊΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΊΠ°ΠΊΠΎΠΌΡƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ соотвСтствуСт:

proc createWindow(x, y, width, height: int; title: string;
                  show: bool): Window

var w = createWindow(show = true, title = "My Application",
                     x = 0, y = 0, height = 600, width = 800)

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ использовали ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ для Π²Ρ‹Π·ΠΎΠ²Π° createWindow, порядок Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² большС Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ значСния. МоТно ΡΠΌΠ΅ΡˆΠΈΠ²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ с Π½Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ, Π½ΠΎ это ΡƒΡ…ΡƒΠ΄ΡˆΠ°Π΅Ρ‚ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒ:

var w = createWindow(0, 0, title = "My Application",
                     height = 600, width = 800, true)

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ провСряСт, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄ΠΈΠ½ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚.


ЗначСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ


Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ createWindow стало ΠΏΡ€ΠΎΡ‰Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ‚Π΅ значСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Ссли Π²Ρ‹Π·Π²Π°Π²ΡˆΠΈΠΉ ΠΈΡ… Π½Π΅ ΡƒΠΊΠ°Π·Π°Π»:

proc createWindow(x = 0, y = 0, width = 500, height = 700,
                  title = "unknown",
                  show = true): Window =
  discard

var w = createWindow(title = "My Application", height = 600, width = 800)

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ createWindow Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ лишь Ρ‚Π΅ значСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΎΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ для ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² со значСниями ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ Ρ‚ΠΈΠΏΠΎΠ², Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½Π΅Ρ‚ нСобходимости ΠΏΠΈΡΠ°Ρ‚ΡŒ title: string = "unknown".


ΠŸΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹


Nim Π΄Π°Ρ‘Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΏΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ с C++:

proc toString(x: int): string =
  result =
    if x < 0: "ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅"
    elif x > 0: "ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅"
    else: "ноль"

proc toString(x: bool): string =
  if x: result = "true"
  else: result = "false"

echo toString(13)    # вызываСтся ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° toString(x: int)
echo toString(true)  # вызываСтся ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° toString(x: bool)
ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅
true

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: toString Π² Nim ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ рСализуСтся ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ $

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Π²Ρ‹Π±Π΅Ρ€Π΅Ρ‚ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΡΡ‰ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ для Π²Ρ‹Π·ΠΎΠ²Π° toString. Как ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π²Ρ‹Π±ΠΎΡ€Π° ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΡ‹Ρ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€, Ρ‚ΡƒΡ‚ ΠΎΠ±ΡΡƒΠΆΠ΄Π°Ρ‚ΡŒΡΡ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ (этот вопрос Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π½ Π² руководствС). Однако ΠΎΠ½ Π½Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ нСприятным ΡΡŽΡ€ΠΏΡ€ΠΈΠ·Π°ΠΌ ΠΈ базируСтся Π½Π° довольно простом Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ΅ ΡƒΠ½ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ. НСоднозначныС Π²Ρ‹Π·ΠΎΠ²Ρ‹ приводят ΠΊ Π²Ρ‹Π²ΠΎΠ΄Ρƒ сообщСния ΠΎΠ± ошибкС.


ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹


Бтандартная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Nim интСнсивно ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ – ΠΎΠ΄Π½Π° ΠΈΠ· ΠΏΡ€ΠΈΡ‡ΠΈΠ½ этого Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ + это просто пСрСгруТСнная ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°. ΠŸΠ°Ρ€ΡΠ΅Ρ€ позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π² инфиксной a + b ΠΈΠ»ΠΈ прСфиксной Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ +a. Π˜Π½Ρ„ΠΈΠΊΡΠ½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ всСгда ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, Π° прСфиксный – всСгда ΠΎΠ΄ΠΈΠ½.

ΠŸΠΎΡΡ‚Ρ„ΠΈΠΊΡΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½Ρ‹, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΠΎΠ³ΡƒΡ‚ привСсти ΠΊ нСоднозначности: a @ @ b ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ (a) @ (@b) ΠΈΠ»ΠΈ (a@) @ (b)? ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ постфиксных ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² Π² Nim Π½Π΅Ρ‚, это Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ всСгда Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ (a) @ (@b).

ΠšΡ€ΠΎΠΌΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… встроСнных ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ²-ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ and, or ΠΈ not, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ всСгда состоят ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… символов: + - * \ / < > = @ $ ~ & % ! ? ^ . |

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ - Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹. Ничто Π½Π΅ ΠΏΠΎΠΌΠ΅ΡˆΠ°Π΅Ρ‚ Π²Π°ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ свой собствСнный ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ @!?+~, Π½ΠΎ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡΡ‚Ρ€Π°Π΄Π°Ρ‚ΡŒ.

ΠŸΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° опрСдСляСтся ΠΏΠΎ Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ символу. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΡΡ‚ΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² руководствС.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€, Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π΅Π³ΠΎ Π² апострофы:

proc `$` (x: myDataType): string = discard
# Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ $ Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈ с myDataType, пСрСкрывая ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ $,
# Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ΅ Ρ€Π°Π½Π΅Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для встроСнных Ρ‚ΠΈΠΏΠΎΠ²

Π­Ρ‚Π° нотация Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для Π²Ρ‹Π·ΠΎΠ²Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹:

if `==`( `+`(3, 4), 7): echo("Π˜ΡΡ‚ΠΈΠ½Π°")
Π˜ΡΡ‚ΠΈΠ½Π°


ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ объявлСния


КаТдая пСрСмСнная, ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ΠΈ Ρ‚.Π΄. Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ объявлСна, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π΅Ρ‘ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. (ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ слоТно ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ Π»ΡƒΡ‡ΡˆΠ΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ для языка, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΌΠ΅Ρ‚Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² Ρ‚ΠΎΠΉ ΠΆΠ΅ стСпСни, Π² ΠΊΠ°ΠΊΠΎΠΉ Π΅Π³ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Nim.) Однако этого нСльзя ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²ΠΎ Π²Π·Π°ΠΈΠΌΠ½ΠΎ рСкурсивных ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°Ρ…:

# ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ объявлСниС:
proc even(n: int): bool
proc odd(n: int): bool =
  assert(n >= 0) # Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ свалимся Π² ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ
  if n == 0: false
  else:
    n == 1 or even(n-1)

proc even(n: int): bool =
  assert(n >= 0) # Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ свалимся Π² ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ
  if n == 1: false
  else:
    n == 0 or odd(n-1)

Π—Π΄Π΅ΡΡŒ odd зависит ΠΎΡ‚ even ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, even Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΡ‚ΡŒΡΡ компилятору Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°. Бинтаксис для Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ объявлСния нСслоТСн: просто пропуститС = ΠΈ Ρ‚Π΅Π»ΠΎ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹. assert добавляСт Π³Ρ€Π°Π½ΠΈΡ‡Π½Ρ‹Π΅ условия ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ описан ΠΏΠΎΠ·Π΄Π½Π΅Π΅ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠœΠΎΠ΄ΡƒΠ»ΠΈ.

Π’ Π΄Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠΈΡ… вСрсиях языка трСбования для ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… объявлСний Π±ΡƒΠ΄ΡƒΡ‚ ΠΌΠ΅Π½Π΅Π΅ строгими.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ Ρ‚Π΅Π»ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ ΠΈΠ· СдинствСнного выраТСния, Ρ‡ΡŒΡ‘ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ возвращаСтся нСявно.


Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹


Как ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Π² Π²Π²Π΅Π΄Π΅Π½ΠΈΠΈ, Nim Ρ€Π°Π·Π»ΠΈΡ‡Π°Π΅Ρ‚ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ соотвСтствСнно ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌΠΈ словами proc, func ΠΈ method. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… аспСктах Nim Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»Π΅Π΅ строг Π² своих опрСдСлСниях, Ρ‡Π΅ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ языки.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Π»ΠΈΠΆΠ΅ ΠΊ ΠΏΠΎΠ½ΡΡ‚ΠΈΡŽ чистой матСматичСской Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π½Π°ΠΊΠΎΠΌΡ‹ΠΌ, Ссли Π²Ρ‹ ΠΊΠΎΠ³Π΄Π°-Π»ΠΈΠ±ΠΎ занимались Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ. Π’ сущности ΠΎΠ½ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°ΠΌΠΈ с Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ограничСниями: ΠΎΠ½ΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΠΎΠΌΡƒ ΡΠΎΡΡ‚ΠΎΡΠ½ΠΈΡŽ (Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ const) ΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Π΅ эффСкты.

ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово func Π² основном являСтся псСвдонимом для proc, ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ {.noSideEffects.}. Но Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ всё ΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ свои измСняСмыС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ ΠΊΠ°ΠΊ var, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π»ΡŽΠ±Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ref. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€, ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ динамичСски. Π­Ρ‚ΠΎ Π·Π²ΡƒΡ‡ΠΈΡ‚ довольно слоТно, Π½ΠΎ этот ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚, тСсно связан с наслСдованиСм ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ. Если Π²Ρ‹ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ (Π΄Π²Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ, Π½ΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ ΠΈΠ»ΠΈ Π½Π°Π±ΠΎΡ€Π°ΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ), какя ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° Π±ΡƒΠ΄Π΅Ρ‚ использована опрСдСляСтся Π½Π° этапС компиляции. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹, с Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, зависят ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ΡΡ ΠΎΡ‚ RootObj. Π­Ρ‚ΠΎ Ρ‚Π΅ΠΌΠ°, которая рассматриваСтся Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ части ΡƒΡ‡Π΅Π±Π½ΠΈΠΊΠ°.


Π˜Ρ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹


Π”Π°Π²Π°ΠΉΡ‚Π΅ вСрнёмся ΠΊ простому ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ с подсчётом:

echo("Π‘Ρ‡ΠΈΡ‚Π°Π΅ΠΌ Π΄ΠΎ дСсяти: ")
for i in countup(1, 10):
  echo($i)
Π‘Ρ‡ΠΈΡ‚Π°Π΅ΠΌ Π΄ΠΎ дСсяти: 
1
2
3
4
5
6
7
8
9
10

МоТно Π»ΠΈ самим Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ countup для использования Π² Ρ‚Π°ΠΊΠΎΠΌ Ρ†ΠΈΠΊΠ»Π΅? Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ:

proc countup(a, b: int): int =
  var res = a
  while res <= b:
    return res
    inc(res)

Π£Π²Ρ‹, это Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π½Π΅ просто Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π° Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ. Π’ΠΎΡ‚ это Β«Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒΒ» называСтся ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ yield. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ лишь Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово proc Π½Π° iterator ΠΈ Π²ΠΎΡ‚ ΠΎΠ½ – наш ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€:

iterator countup(a, b: int): int =
  var res = a
  while res <= b:
    yield res
    inc(res)

Π˜Ρ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠΈ Π½Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹, Π½ΠΎ ΠΈΠΌΠ΅ΡŽΡ‚ нСсколько Π²Π°ΠΆΠ½Ρ‹Ρ… Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠΉ:

Однако, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ closure, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π½Π°Π±ΠΎΡ€ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΡΡ‚ΠΈ смотритС Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Β«Π˜Ρ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ класса». Π˜Ρ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚Π΅ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π° ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, Ρ‡Ρ‚ΠΎ ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹: Ρƒ Π½ΠΈΡ… своё собствСнноС пространство ΠΈΠΌΡ‘Π½. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π΅ΡΡ‚ΡŒ общСпринятая ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° оборачивания ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² Π² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ с Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΠΊΠ°ΠΏΠ»ΠΈΠ²Π°ΡŽΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Π΅Π³ΠΎ Π² Π²ΠΈΠ΄Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ΠΊΠ°ΠΊ split ΠΈΠ· модуля std/strutils.


Π‘Π°Π·ΠΎΠ²Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹


Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Ρ€Π°Π·Π±ΠΈΡ€Π°ΡŽΡ‚ΡΡ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ встроСнныС Ρ‚ΠΈΠΏΡ‹ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ для Π½ΠΈΡ… доступны.


ЛогичСскиС значСния bool


ЛогичСский Ρ‚ΠΈΠΏ Π² Nim называСтся bool ΠΈ состоит ΠΈΠ· Π΄Π²ΡƒΡ… ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ true ΠΈ false. Условия Π² ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ… while```,`` if, elifΠΈwhenΠ΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΈΠΏbool`.

Для Ρ‚ΠΈΠΏΠ° bool ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ not, and, or, xor, <, <=, >, >=, != ΠΈ ==. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ and ΠΈ or Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ сокращённыС вычислСния. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

while p != nil and p.name != "xyz":
  # p.name Π½Π΅ вычисляСтся, Ссли p == nil
  p = p.next


Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ‹ char


Π‘ΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ Π² Nim называСтся char. Π•Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ€Π°Π²Π΅Π½ ΠΎΠ΄Π½ΠΎΠΌΡƒ Π±Π°ΠΉΡ‚Ρƒ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ собой символ UTF-8, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΅Π³ΠΎ Ρ‡Π°ΡΡ‚ΡŒ. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° этого Π² эффСктивности: Π² ΠΏΠΎΠ΄Π°Π²Π»ΡΡŽΡ‰Π΅ΠΌ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² UTF-8, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ UTF-8 Π±Ρ‹Π» Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ для этого. Π‘ΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ Π·Π°ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ Π² ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹Π΅ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ.

Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ==, <, <=, > ΠΈ >=. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ $ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ char Π² string. Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ‹ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΌΠ΅ΡˆΠΈΠ²Π°Ρ‚ΡŒΡΡ с Ρ†Π΅Π»Ρ‹ΠΌΠΈ числами; для получСния числСнного значСния символа ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ ord. ΠšΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ· числСнного значСния Π² символ выполняСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ chr.


Π‘Ρ‚Ρ€ΠΎΠΊΠΈ string


Π‘Ρ‚Ρ€ΠΎΠΊΠΎΠ²Ρ‹Π΅ значСния Π² Nim измСняСмыС, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ опСрация добавлСния подстроки ΠΊ строкС довольно эффСктивна. Π‘Ρ‚Ρ€ΠΎΠΊΠΈ Π² Nim ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π½ΡƒΠ»Ρ‘ΠΌ ΠΈ содСрТат ΠΏΠΎΠ»Π΅ Π΄Π»ΠΈΠ½Ρ‹. Π”Π»ΠΈΠ½Ρƒ строки ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ встроСнной ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ΠΎΠΉ len; Π΄Π»ΠΈΠ½Π° Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠΉ ноль. ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰Π΅ΠΌΡƒ Π½ΡƒΠ»ΡŽ - ошибка, ΠΎΠ½ сущСствуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Nim строки ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹Ρ‚ΡŒ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π² cstring Π±Π΅Π· создания ΠΊΠΎΠΏΠΈΠΈ.

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присвоСния для строк ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ строку. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ & для ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΠΈ строк ΠΈ add для добавлСния ΠΊ строкС.

Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ строк производится Π² лСксикографичСском порядкС. Допустимы Π»ΡŽΠ±Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ сравнСния. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, всС строки ΡΠ²Π»ΡΡŽΡ‚ΡΡ строками UTF-8, Π½ΠΎ это Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ. НапримСр, ΠΏΡ€ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ строк ΠΈΠ· Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΎΠ½ΠΈ, скорСС, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π±Π°ΠΉΡ‚ΠΎΠ². ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ s[i] ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ i-ΠΉ char строки, Π° Π½Π΅ i-ΠΉ юникод символ unichar.

Π‘Ρ‚Ρ€ΠΎΠΊΠΎΠ²Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ пустой строкой "".


Π¦Π΅Π»Ρ‹Π΅ числа int


Nim ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ встроСнныС цСлочислСнныС Ρ‚ΠΈΠΏΡ‹: int, int8, int16, int32, int64, uint, uint8, uint16, uint32 ΠΈ uint64.

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ цСлочислСнный Ρ‚ΠΈΠΏ int. ЦСлочислСнныС Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ суффикс, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰ΠΈΠΉ ΠΈΡ… ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΌΡƒ цСлочислСнному Ρ‚ΠΈΠΏΡƒ:

let
  x = 0     # int
  y = 0'i8  # int8
  z = 0'i64 # int64
  u = 0'u   # uint

echo "x ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ ", typeof(x)
echo "y ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ ", typeof(y)
echo "z ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ ", typeof(z)
echo "u ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ ", typeof(u)
x ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ int
y ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ int8
z ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ int64
u ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ uint

Π§Π°Ρ‰Π΅ всСго Ρ†Π΅Π»Ρ‹Π΅ числа ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для подсчёта ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Ρ€Π°Π·ΠΌΠ΅Ρ‰Ρ‘Π½Π½Ρ‹Ρ… Π² памяти, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ int Ρ€Π°Π²Π΅Π½ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ указатСля.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ +, -, *, div, mod, <, <=, ==, !=, > ΠΈ >= ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ для Ρ†Π΅Π»Ρ‹Ρ… чисСл. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ and, or, xor ΠΈ not Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ для Ρ†Π΅Π»Ρ‹Ρ… чисСл ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. Π‘ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ сдвиг Π²Π»Π΅Π²ΠΎ дСлаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° shl, Π° сдвиг Π²ΠΏΡ€Π°Π²ΠΎ – с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° shr. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ сдвига всСгда Ρ‚Ρ€Π°ΠΊΡ‚ΡƒΡŽΡ‚ свой Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΊΠ°ΠΊ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ΅ число. Они ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для умноТСния ΠΈΠ»ΠΈ дСлСния.

ВсС Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ цикличСский ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄, соотвСтствСнно, ΠΎΠ½ΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ привСсти ΠΊ ошибкам пСрСполнСния.

АвтоматичСскоС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² выполняСтся Π² выраТСниях, Π³Π΄Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ цСлочислСнныС Ρ‚ΠΈΠΏΡ‹. Однако, Ссли ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Π²Π΅Π΄Ρ‘Ρ‚ ΠΊ ΠΏΠΎΡ‚Π΅Ρ€Π΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, вызываСтся ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ RangeDefect (Ссли ошибка Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π° Π½Π° этапС компиляции).


Числа с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой float


Nim ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ встроСнныС Ρ‚ΠΈΠΏΡ‹ чисСл с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой: float, float32 ΠΈ float64.

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΈΠΏ float. Π’ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ float всСгда ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ 64 Π±ΠΈΡ‚Π°.

Π›ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ чисСл с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ суффикс, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰ΠΈΠΉ ΠΈΡ… ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ чисСл с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой:

var
  x = 0.0      # float
  y = 0.0'f32  # float32
  z = 0.0'f64  # float64

echo "x ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ ", typeof(x)
echo "y ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ ", typeof(y)
echo "z ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ ", typeof(z)
x ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ float64
y ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ float32
z ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ float64

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ +, -, *, /, <, <=, ==, !=, > ΠΈ >= ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ для чисСл с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ стандарту IEEE-754.

АвтоматичСскоС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² Π² выраТСниях с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Π²ΠΈΠ΄Π°ΠΌΠΈ Ρ‚ΠΈΠΏΠΎΠ² с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой выполняСтся: мСньшиС Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² большиС. ЦСлочислСнныС Ρ‚ΠΈΠΏΡ‹ Π½Π΅ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ автоматичСски Π² Ρ‚ΠΈΠΏΡ‹ с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚. Для Ρ‚Π°ΠΊΠΈΡ… ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ toInt ΠΈ toFloat.


ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ²


ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ Π±Π°Π·ΠΎΠ²Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π² Nim выполняСтся ΠΏΡƒΡ‚Ρ‘ΠΌ использования Ρ‚ΠΈΠΏΠ° ΠΊΠ°ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

var
  x: int32 = 1.int32   #  Ρ‚ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·ΠΎΠ² int32(1)
  y: int8  = int8('a') # 'a' == 97'i8
  z: float = 2.5       # int(2.5) округляСтся Π΄ΠΎ 2
  sum: int = int(x) + int(y) + int(z)

echo "x = ", x, "; y = ", y, "; z = ", z
echo "int(x) + int(y) + int(z) = ", sum
x = 1; y = 97; z = 2.5
int(x) + int(y) + int(z) = 100


Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ прСдставлСниС Ρ‚ΠΈΠΏΠΎΠ²


Как ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Ρ€Π°Π½Π΅Π΅, встроСнный ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ прСобразования Π² строку $ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ любой Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ Π² строку, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ вывСсти Π½Π° экран с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ echo. Однако ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ $ Π½Π΅ смоТСт Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ со слоТными Ρ‚ΠΈΠΏΠ°ΠΌΠΈ ΠΈΠ»ΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ создали ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΏΠΎΠΊΠ° Π²Ρ‹ Π½Π΅ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ Π΅Π³ΠΎ для Π½ΠΈΡ….

Иногда ΠΏΡ€ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΡƒΠ·Π½Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ слоТного Ρ‚ΠΈΠΏΠ°, Π½Π΅ прибСгая ΠΊ написанию для Π½Π΅Π³ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° $. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ΠΎΠΉ repr, которая Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Π»ΡŽΠ±Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ ΠΈ Π΄Π°ΠΆΠ΅ со слоТными цикличСскими Π³Ρ€Π°Ρ„Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΄Π°ΠΆΠ΅ для Π±Π°Π·ΠΎΠ²Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π΅ΡΡ‚ΡŒ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ $ ΠΈ repr:

var
  myBool = true
  myCharacter = 'n'
  myString = "nim"
  myInteger = 42
  myFloat = 3.14

echo "bool   ", $myBool, ":", repr(myBool)
echo "char   ", $myCharacter, ":", repr(myCharacter)
echo "string ", $myString, ":", repr(myString)
echo "int    ", $myInteger, ":", repr(myInteger)
echo "float  ", $myFloat, ":", repr(myFloat)
bool   true:true
char   n:'n'
string nim:"nim"
int    42:42
float  3.14:3.14


Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹


НовыС Ρ‚ΠΈΠΏΡ‹ Π² Nim ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ type:

type
  biggestInt = int64      # цСлочислСнный Ρ‚ΠΈΠΏ, самый большой ΠΈΠ· доступных
  biggestFloat = float64  # Ρ‚ΠΈΠΏ с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой, самый большой ΠΈΠ· доступных

ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΡ ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±ΡŒΡΠ²Π»Π΅Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ type выраТСния.


ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈe enum


ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ, относящаяся ΠΊ Ρ‚ΠΈΠΏΡƒ пСрСчислСний, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ лишь ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ΅ мноТСство Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Π­Ρ‚ΠΎ мноТСство состоит ΠΈΠ· упорядочСнных символов. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ символ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ отобраТаСтся Π½Π° цСлочислСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ символ соотвСтствуСт числу 0, Π²Ρ‚ΠΎΡ€ΠΎΠΉ – числу 1 ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

type
  Direction = enum
    north, east, south, west

var x = south
echo typeof(x) # `x` ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ `Direction`
echo $x        # a Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ `south`
Direction
south

Для пСрСчислСний ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π»ΡŽΠ±Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ сравнСния.

Π’ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Π½ΠΈΠ΅ нСоднозначности символы пСрСчислСний ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹: Direction.south.

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ $ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ любоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ пСрСчислСния Π² Π΅Π³ΠΎ имя, Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ord – Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ цСлочислСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

Для Π»ΡƒΡ‡ΡˆΠ΅Π³ΠΎ взаимодСйствия с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ языками программирования, символам пСрСчислСний ΠΌΠΎΠ³ΡƒΡ‚ явно Π½Π°Π·Π½Π°Ρ‡Π°Ρ‚ΡŒΡΡ цСлочислСнныС значСния. Однако ΠΎΠ½ΠΈ Π² любом случаС Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ Π² порядкС возрастания. Π‘ΠΈΠΌΠ²ΠΎΠ», ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π½Π΅ Π±Ρ‹Π»ΠΎ явно Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΎ числСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ символа плюс 1.

Π―Π²Π½ΠΎ ΠΏΡ€ΠΎΠ½ΡƒΠΌΠ΅Ρ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ пСрСчислСния ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ пропуски:

type
  MyEnum = enum
    a = 2, b = 4, c = 89


ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΠΌΡ‹Π΅ Ρ‚ΠΈΠΏΡ‹ Ordinal


ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΡ, цСлочислСнныС Ρ‚ΠΈΠΏΡ‹, char, bool (ΠΈ ΠΏΠΎΠ΄Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ‹) – всС ΠΎΠ½ΠΈ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ пСрСчислимыми Ρ‚ΠΈΠΏΠ°ΠΌΠΈ. Для пСрСчислимых Ρ‚ΠΈΠΏΠΎΠ² Π΅ΡΡ‚ΡŒ нСсколько ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ:

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ
ord(x) Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ†Π΅Π»ΠΎΠ΅ число, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для прСдставлСния значСния x
inc(x) ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ x Π½Π° 1
inc(x, n) ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ x Π½Π° n; n – Ρ†Π΅Π»ΠΎΠ΅ число
dec(x) ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ x Π½Π° 1
dec(x, n) ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ x Π½Π° n; n – Ρ†Π΅Π»ΠΎΠ΅ число
succ(x) Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π·Π° x элСмСнт
succ(x, n) Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ n-ΠΉ элСмСнт, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π·Π° x
pred(x) Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²Π΅Π½Π½ΠΈΠΊΠ° x
pred(x, n) Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ n-Π³ΠΎ ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²Π΅Π½Π½ΠΈΠΊΠ° x

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ inc, dec, succ ΠΈ pred ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒΡΡ с ошибкой, Π²Ρ‹Π·Π²Π°Π² ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ RangeDefect ΠΈΠ»ΠΈ OverflowDefect. (Если, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΊΠΎΠ΄ скомпилирован со Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΌΠΈ подходящими ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°ΠΌΠΈ.)


Π”ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ‹ range


Π­Ρ‚ΠΎΡ‚ Ρ‚ΠΈΠΏ прСдставляСт собой Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ цСлочислСнного Ρ‚ΠΈΠΏΠ° ΠΈΠ»ΠΈ пСрСчислСния (Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°). ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

type
  MySubrange = range[0..5]

MySubrange это Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ int, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ значСния ΠΎΡ‚ 0 Π΄ΠΎ 5. НазначСниС Π»ΡŽΠ±Ρ‹Ρ… Π΄Ρ€ΡƒΠ³ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ‚ΠΈΠΏΠ° MySubrange ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ ошибкС ΠΏΡ€ΠΈ компиляции ΠΈΠ»ΠΈ Π²ΠΎ врСмя выполнСния. НазначСниС Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ· Π΅Π³ΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ² (ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚) Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ.

ΠœΠΎΠ΄ΡƒΠ»ΡŒ system ΠΈΠΌΠ΅Π΅Ρ‚ Π²Π°ΠΆΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ Natural, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΉ ΠΊΠ°ΠΊ range[0..high(int)] (high Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ максимально допустимоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ). Π”Ρ€ΡƒΠ³ΠΈΠ΅ языки программирования, для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½Π°Ρ‚ΡƒΡ€Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ числами, ΠΏΡ€ΠΈΠ½ΡƒΠΆΠ΄Π°ΡŽΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²Ρ‹Π΅ Ρ†Π΅Π»Ρ‹Π΅ числа. Π­Ρ‚ΠΎ часто Π±Ρ‹Π²Π°Π΅Ρ‚ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ: вас Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΡƒΡŽ Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΡƒ лишь ΠΏΠΎ Ρ‚ΠΎΠΉ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅, Ρ‡Ρ‚ΠΎ числа Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ. Π’ΠΈΠΏ Natural языка Nim позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ этой распространённой ошибки Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ.


ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²Π° set


Π’ΠΈΠΏ set ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΡƒΠ΅Ρ‚ матСматичСскоС понятиС мноТСства. Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ мноТСства ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ пСрСчислимым Ρ‚ΠΈΠΏΠΎΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ:

ΠΈΠ»ΠΈ эквивалСнтным. Когда Π²Ρ‹ создаётС мноТСство с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΎΠ² Ρ†Π΅Π»Ρ‹Ρ… чисСл со Π·Π½Π°ΠΊΠΎΠΌ, Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ сСта опрСдСляСтся ΠΊΠ°ΠΊ находящийся Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΠΎΡ‚ 0 Π΄ΠΎ DefaultSetElements-1, Π³Π΄Π΅ DefaultSetElements Π² настоящСС врСмя всСгда Ρ€Π°Π²Π½ΠΎ (2^8). Максимальная Π΄Π»ΠΈΠ½Π° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° для Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° мноТСства - это MaxSetElements, которая Π² настоящСС врСмя всСгда Ρ€Π°Π²Π½Π° (2^16). Π’ΠΈΠΏΡ‹ с большСй Π΄Π»ΠΈΠ½ΠΎΠΉ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ΡΡ Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΎΡ‚ 0 Π΄ΠΎ MaxSetElements-1.

Π­Ρ‚ΠΎ связано с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ мноТСства Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ ΠΊΠ°ΠΊ Π²Ρ‹ΡΠΎΠΊΠΎΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π²Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ Π±ΠΈΡ‚ΠΎΠ². ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ мноТСство с Π±ΠΎΠ»Π΅Π΅ ΠΊΡ€ΡƒΠΏΠ½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ошибкС:

var s: set[int64] # Error: set is too large; ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ `std/sets` для пСрСчислимых Ρ‚ΠΈΠΏΠΎΠ²
                  # с большС Ρ‡Π΅ΠΌ 2^16 Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… элСмСнтов

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π² Nim Ρ‚Π°ΠΊΠΆΠ΅ Π΅ΡΡ‚ΡŒ Ρ…Π΅Ρˆ мноТСства - std/sets, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅Ρ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ.

ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²Π° ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ сконструированы с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ конструктора мноТСства: {} это пустоС мноТСство. ΠŸΡƒΡΡ‚ΠΎΠ΅ мноТСство совмСстимо ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ с Π»ΡŽΠ±Ρ‹ΠΌ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ мноТСства. ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ элСмСнтов (ΠΈ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ² элСмСнтов):

type
  CharSet = set[char]
var
  x: CharSet
x = {'a'..'z', '0'..'9'} # ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²ΠΎ, содСрТащСС Π±ΡƒΠΊΠ²Ρ‹ ΠΎΡ‚ 'a' Π΄ΠΎ 'z'
                         # ΠΈ Ρ†ΠΈΡ„Ρ€Ρ‹ ΠΎΡ‚ '0' Π΄ΠΎ '9'

ΠœΠΎΠ΄ΡƒΠ»ΡŒ std/setutils прСдоставляСт ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ для создания мноТСства ΠΈΠ· ΠΈΡ‚Π΅Ρ€Π°Π±Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ²:

import std/setutils

let uniqueChars = myString.toSet

Для мноТСств ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ:

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ ОписаниС
A + B объСдинСниС Π΄Π²ΡƒΡ… мноТСств
A * B пСрСсСчСниС Π΄Π²ΡƒΡ… мноТСств
A - B Ρ€Π°Π·Π½ΠΎΡΡ‚ΡŒ Π΄Π²ΡƒΡ… мноТСств (A Π±Π΅Π· элСмСнтов B)
A == B равСнство мноТСств
A <= B ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ подмноТСства (A являСтся подмноТСством B ΠΈΠ»ΠΈ эквивалСнтно B)
A < B строгоС ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ подмноТСства (A являСтся подмноТСством B)
e in A ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎ мноТСству (A содСрТит элСмСнт e)
e notin A A Π½Π΅ содСрТит элСмСнт e
contains(A, e) A содСрТит элСмСнт e
card(A) ΠΌΠΎΡ‰Π½ΠΎΡΡ‚ΡŒ A (количСство элСмСнтов Π² A)
incl(A, elem) Ρ‚ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ A = A + {elem}
excl(A, elem) Ρ‚ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ A = A - {elem}


Поля Π±ΠΈΡ‚ΠΎΠ²


ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²Π° часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для Ρ„Π»Π°Π³ΠΎΠ² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹. Π­Ρ‚ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΠ΅ (ΠΈ типобСзопасноС) Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, Ρ‡Π΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ цСлочислСнных констант, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°Π΄ΠΎ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ or.

ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΡ, мноТСства ΠΈ каст ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ вмСстС ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

type
  MyFlag* {.size: sizeof(cint).} = enum
    A
    B
    C
    D
  MyFlags = set[MyFlag]

proc toNum(f: MyFlags): int = cast[cint](f)
proc toFlags(v: int): MyFlags = cast[MyFlags](v)

assert toNum({}) == 0
assert toNum({A}) == 1
assert toNum({D}) == 8
assert toNum({A, C}) == 5
assert toFlags(0) == {}
assert toFlags(7) == {A, B, C}

Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅ ΠΊΠ°ΠΊ мноТСства ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ пСрСчислСния Π² стСпСни числа 2.

Когда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ пСрСчислСния ΠΈ мноТСства с C, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ cint (distinct cint).

Для совмСстимогог ΠΊΠΎΠ΄Π° с C, смотри - bitsize pragma.


Массив array


Массив прСдставляСт собой простой ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ фиксированного Ρ€Π°Π·ΠΌΠ΅Ρ€Π°. ВсС Π΅Π³ΠΎ элСмСнты ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ‚ΠΈΠΏ. Π’ качСствС индСкса массива ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ любой пСрСчислимый Ρ‚ΠΈΠΏ.

Массив ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ создан с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ []:

type
  IntArray = array[0..5, int] # массив Ρ†Π΅Π»Ρ‹Ρ… чисСл, индСксированный ΠΎΡ‚ 0 Π΄ΠΎ 5
var
  x: IntArray
x = [1, 2, 3, 4, 5, 6]
for i in low(x)..high(x):
  echo x[i], " Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ", i
1 Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 0
2 Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 1
3 Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 2
4 Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 3
5 Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 4
6 Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 5

Нотация x[i] ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для получСния доступа ΠΊ i-ΠΌΡƒ элСмСнту x. ΠŸΡ€ΠΈ доступС ΠΊ элСмСнтам массива всСгда производится ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π³Ρ€Π°Π½ΠΈΡ† (Π»ΠΈΠ±ΠΎ Π²ΠΎ врСмя компиляции, Π»ΠΈΠ±ΠΎ Π²ΠΎ врСмя выполнСния). Π­Ρ‚Ρƒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π³ΠΌΠ°ΠΌΠΈ ΠΈΠ»ΠΈ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ компилятора с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ --bound_checks:off.

ΠœΠ°ΡΡΠΈΠ²Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ-значСниями, ΠΊΠ°ΠΊ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ Nim. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ содСрТимоС массива Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ.

ВстроСнная ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° len Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΄Π»ΠΈΠ½Ρƒ массива. low(a) Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ наимСньший Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΉ индСкс массива a, Π° high(a) – наибольший Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΉ индСкс.

type
  Direction = enum
    north, east, south, west
  BlinkLights = enum
    Off, On, slowBlink, mediumBlink, fastBlink
  LevelSetting = array[north..west, BlinkLights]
var
  level: LevelSetting
level[north] = On
level[south] = slowBlink
level[east] = fastBlink
echo "repr(level) = ", repr(level)
echo "low(level) = ", low(level)
echo "len(level) = ", len(level)
echo "high(level) = ", high(level)
repr(level) = [On, fastBlink, slowBlink, Off]
low(level) = north
len(level) = 4
high(level) = west

Бинтаксис для Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… массивов (мноТСствСнная Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ) Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… языках сводится ΠΊ добавлСнию Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Ρ… скобок, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ‚ΠΈΠΏΠ°, Ρ‡Ρ‚ΠΎ ΠΈ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅. Π’ Nim Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ измСрСния с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ индСксными Ρ‚ΠΈΠΏΠ°ΠΌΠΈ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ синтаксис влоТСнности нСсколько Π΄Ρ€ΡƒΠ³ΠΎΠΉ. ΠžΡΠ½ΠΎΠ²Ρ‹Π²Π°ΡΡΡŒ Π½Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, Π³Π΄Π΅ level ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ ΠΊΠ°ΠΊ массив пСрСчислСний, индСксированный Π΄Ρ€ΡƒΠ³ΠΈΠΌ пСрСчислСниСм, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ строки, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Π°Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ‚ΠΈΠΏΡƒ маяка Ρ€Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒΡΡ ΠΏΠΎ уровням, доступ ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· ΠΈΡ… цСлочислСнный индСкс:

type
  LightTower = array[1..3, LevelSetting]
var
  tower: LightTower
tower[1][north] = slowBlink
tower[1][east] = mediumBlink
echo "len(tower)    = ", len(tower)
echo "len(tower[1]) = ", len(tower[1])
echo "repr(tower)   = ", repr(tower)
# Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ строки Π½Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈΠ·-Π·Π° нСсовпадСния Ρ‚ΠΈΠΏΠΎΠ²
#tower[north][east] = on
#tower[0][1] = on
len(tower)    = 3
len(tower[1]) = 4
repr(tower)   = [[slowBlink, mediumBlink, Off, Off], [Off, Off, Off, Off], [Off, Off, Off, Off]]

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ встроСнная ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° len Π²Π΅Ρ€Π½Ρ‘Ρ‚ Π΄Π»ΠΈΠ½Ρƒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ массива ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ уровня. Π§Ρ‚ΠΎΠ±Ρ‹ Π΅Ρ‰Ρ‘ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡƒΡŽ ΠΏΡ€ΠΈΡ€ΠΎΠ΄Ρƒ LightTower, ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° LevelSetting, Π° вмСсто этого Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π΅Π³ΠΎ нСпосрСдствСнно Π² Ρ‚ΠΈΠΏ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ измСрСния:

type
  LightTower = array[1..10, array[north..west, BlinkLights]]

Π”ΠΎΠ²ΠΎΠ»ΡŒΠ½ΠΎ часто массивы Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с нуля, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ сокращённый синтаксис для задания Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° ΠΎΡ‚ нуля Π΄ΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ индСкса минус ΠΎΠ΄ΠΈΠ½:

type
  IntArray = array[0..5, int] # массив, индСксированный ΠΎΡ‚ 0 Π΄ΠΎ 5
  QuickArray = array[6, int]  # массив, индСксированный ΠΎΡ‚ 0 Π΄ΠΎ 5
var
  x: IntArray
  y: QuickArray
x = [1, 2, 3, 4, 5, 6]
y = x
for i in low(x)..high(x):
  echo "i = ", i, "; ", "x[i] = ", x[i], "; y[i] = ", y[i]
i = 0; x[i] = 1; y[i] = 1
i = 1; x[i] = 2; y[i] = 2
i = 2; x[i] = 3; y[i] = 3
i = 3; x[i] = 4; y[i] = 4
i = 4; x[i] = 5; y[i] = 5
i = 5; x[i] = 6; y[i] = 6


ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ seq


ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΠΎΡ…ΠΎΠΆΠΈ Π½Π° массивы, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΡ… Π΄Π»ΠΈΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Π² Ρ…ΠΎΠ΄Π΅ выполнСния (ΠΊΠ°ΠΊ Ρƒ строк). ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€, ΠΎΠ½ΠΈ всСгда Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ Π² ΠΊΡƒΡ‡Π΅ ΠΈ ΡƒΡ‡Π°ΡΡ‚Π²ΡƒΡŽΡ‚ Π² сборкС мусора.

ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ всСгда ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡ€ΡƒΡŽΡ‚ΡΡ int, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠΌΡΡ с 0. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ len, low ΠΈ high ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ для ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ. Нотация x[i] ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для доступа ΠΊ i-ΠΌΡƒ элСмСнту x.

ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ конструктора массива [], соСдинённого с ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ прСобразования массива Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ @. Π”Ρ€ΡƒΠ³ΠΎΠΉ способ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ для ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ состоит Π² Π²Ρ‹Π·ΠΎΠ²Π΅ встроСнной ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ newSeq.

ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ openarray.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

var
  x: seq[int] # ссылка Π½Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Ρ†Π΅Π»Ρ‹Ρ… чисСл
x = @[1, 2, 3, 4, 5, 6] # @ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ массив Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Ρ€Π°Π·ΠΌΠ΅Ρ‰Ρ‘Π½Π½ΡƒΡŽ Π² ΠΊΡƒΡ‡Π΅

ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅Ρ‚ @[].

Команда for, использованная для ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ»ΠΈ двумя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ. Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Ρ„ΠΎΡ€ΠΌΡƒ с ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Ρ‚ΠΎ пСрСмСнная Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, прСдоставляСмоС ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ. Команда for ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΌ ΠΈΠ· ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° items() модуля std/system.

Но Ссли Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Ρ„ΠΎΡ€ΠΌΡƒ с двумя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ, Ρ‚ΠΎΠ³Π΄Π° пСрвая пСрСмСнная содСрТит индСкс ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ, Π° вторая – Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π’ этом случаС ΠΊΠΎΠΌΠ°Π½Π΄Π° for ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° pairs() ΠΈΠ· модуля system. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:

for i in @[3, 4, 5]:
  echo($i)
3
4
5
for i, value in @[3, 4, 5]:
  echo "позиция: ", $i, ", Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:", $value
позиция: 0, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:3
позиция: 1, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:4
позиция: 2, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:5


ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ массивы openarray


ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ массивы ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

Часто выясняСтся, Ρ‡Ρ‚ΠΎ массивы с фиксированным Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ нСдостаточно Π³ΠΈΠ±ΠΊΠΈ: ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°ΠΌ Π±Ρ‹Π²Π°Π΅Ρ‚ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π΅Π»ΠΎ с массивами Ρ€Π°Π·Π½Ρ‹Ρ… Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ². Для этого Π΅ΡΡ‚ΡŒ Ρ‚ΠΈΠΏ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ массива.

ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ массивы всСгда ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ†Π΅Π»Ρ‹ΠΌΠΈ числами ΠΈ нумСрация начинаСтся с 0. Для Π½ΠΈΡ… доступны ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ len, low ΠΈ high. Π›ΡŽΠ±ΠΎΠΉ массив с совмСстимым Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ массива, Ρ‚ΠΈΠΏ индСкса Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ значСния.

var
  fruits:   seq[string]       # ссылка Π½Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ строк, которая
                              # ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 'nil'
  capitals: array[3, string]  # массив строк с фиксированным Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ

fruits = @[]                  # создаёт Π² ΠΊΡƒΡ‡Π΅ ΠΏΡƒΡΡ‚ΡƒΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Π½Π°
                              # ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π±ΡƒΠ΄Π΅Ρ‚ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ 'fruits'

capitals = ["New York", "London", "Berlin"]   # массив 'capitals' позволяСт
                                              # ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ лишь Ρ‚Ρ€ΠΈ элСмСнта
fruits.add("Banana")          # ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ 'fruits' динамичСски
                              # Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ΡΡ Π² Ρ…ΠΎΠ΄Π΅ выполнСния
fruits.add("Mango")

proc openArraySize(oa: openArray[string]): int =
  oa.len

assert openArraySize(fruits) == 2     # ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ
                                      # Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°
assert openArraySize(capitals) == 3   # Π½ΠΎ ΠΈ массив Ρ‚ΠΎΠΆΠ΅

Π’ΠΈΠΏ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ массива Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌ: ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅Ρ€Π½Ρ‹Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ массивы Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½ΡƒΠΆΠ΄Π° Π² Π½ΠΈΡ… Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Ρ€Π΅Π΄ΠΊΠΎ ΠΈ ΠΈΡ… нСльзя Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ эффСктивно.


ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ количСством Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² varargs


ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ varargs Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ массив. Однако, Π²Π΄ΠΎΠ±Π°Π²ΠΎΠΊ ΠΎΠ½ позволяСт ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ любоС число Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ автоматичСски ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ список Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π² массив:

proc myWriteln(f: File, a: varargs[string]) =
  for s in items(a):
    write(f, s)
  write(f, "\n")

myWriteln(stdout, "abc", "def", "xyz")
# прСвращаСтся компилятором Π²:
myWriteln(stdout, ["abc", "def", "xyz"])

Π­Ρ‚ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ дСлаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ varargs послСдний Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹. Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² Π² этом контСкстС:

proc myWriteln(f: File, a: varargs[string, `$`]) =
  for s in items(a):
    write(f, s)
  write(f, "\n")

myWriteln(stdout, 123, "abc", 4.0)
# прСвращаСтся компилятором Π²:
myWriteln(stdout, [$123, $"abc", $4.0])

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ $ примСняСтся ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρƒ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠΌΡƒ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ a. Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ $, ΠΏΡ€ΠΈΠΌΠ΅Π½Ρ‘Π½Π½Ρ‹ΠΉ ΠΊ строкам, Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ.


Π‘Ρ€Π΅Π·Ρ‹ Slice


Π‘Ρ€Π΅Π·Ρ‹ выглядят ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° Ρ‚ΠΈΠΏΡ‹ ΠΏΠΎΠ΄Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ² ΠΏΠΎ синтаксису, Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ контСкстС. Π‘Ρ€Π΅Π· β€” это просто ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° Slice, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит Π΄Π²Π΅ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹, a ΠΈ b. Π‘Π°ΠΌ ΠΏΠΎ сСбС срСз Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π΅Π½, Π½ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Slice для опрСдСлСния Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ².

var
  a = "Nim is a programming language"
  b = "Slices are useless."

echo a[7 .. 12] # --> 'a prog'
b[11 .. ^2] = "useful"
echo b # --> 'Slices are useful.'
a prog
Slices are useful.

Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ срСзы ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для измСнСния части строки. Π“Ρ€Π°Π½ΠΈΡ†Ρ‹ срСза ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ значСния, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ ΠΈΡ… Ρ‚ΠΈΠΏΠΎΠΌ, Π½ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π°Ρ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ срСза, опрСдСляСт, ΠΊΠ°ΠΊΠΈΠ΅ значСния допустимы.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ способы указания индСксов строк, массивов, ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ ΠΈ Ρ‚. Π΄., Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² Nim ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ индСксация с нуля.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, строка b ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π»ΠΈΠ½Ρƒ 19, ΠΈ Π΄Π²Π° Ρ€Π°Π·Π½Ρ‹Ρ… способа указания индСксов выглядят Ρ‚Π°ΠΊ:

"Slices are useless." | | | 0 11 17 использованиС индСксов ^19 ^8 ^2 использованиС синтаксиса с ^

Π³Π΄Π΅ b[0 .. ^1] эквивалСнтно b[0 .. b.len-1] ΠΈ b[0 ..< b.len], ΠΈ Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ^1 прСдоставляСт сокращённый способ указания b.len-1. Π‘ΠΌ. ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ индСкса.

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎ строка заканчиваСтся Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ, Ссли ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒ строки "useless" ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΅Ρ‘ Π½Π° "useful":

b[11 .. ^2] β€” Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ "useless", Π° b[11 .. ^2] = "useful" замСняСт "useless" Π½Π° "useful", давая Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ "Slices are useful.".

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ 1: Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ способы записи: b[^8 .. ^2] = "useful" ΠΈΠ»ΠΈ b[11 .. b.len-2] = "useful", ΠΈΠ»ΠΈ b[11 ..< b.len-1] = "useful".

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ 2: ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ шаблон ^ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ int Ρ‚ΠΈΠΏΠ° BackwardsIndex, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ константу lastIndex ΠΊΠ°ΠΊ const lastIndex = ^1 ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Ρ‘ ΠΊΠ°ΠΊ b[0 .. lastIndex].


ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ object


Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ для объСдинСния Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² Π΅Π΄ΠΈΠ½ΡƒΡŽ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡƒΡŽ структуру являСтся Ρ‚ΠΈΠΏ object. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ β€” это Ρ‚ΠΈΠΏ-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚: ΠΏΡ€ΠΈ присваивании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π½ΠΎΠ²ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ всС Π΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Foo ΠΈΠΌΠ΅Π΅Ρ‚ конструктор Foo(ΠΏΠΎΠ»Π΅: Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ...), Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС Π΅Π³ΠΎ поля. НСуказанныС поля ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

type
  Person = object
    name: string
    age: int

var person1 = Person(name: "Peter", age: 30)

echo person1.name # "Peter"
echo person1.age  # 30

var person2 = person1 # копия person1

person2.age += 14

echo person1.age # 30
echo person2.age # 44


# порядок ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ΅Π½ΡΡ‚ΡŒ
let person3 = Person(age: 12, name: "Quentin")
doAssert person3.age == 12

# Π½Π΅ всС поля ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹
let person4 = Person(age: 3)
# Π½Π΅ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ поля ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ значСниями ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.
# Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС это пустая строка.
doAssert person4.name == ""
Peter
30
30
44

Поля ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π²ΠΈΠ΄Π½Ρ‹ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ модуля, Π³Π΄Π΅ ΠΎΠ½ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠΌΠ΅Ρ‡Π°Ρ‚ΡŒ символом *.

type
  Person* = object # Ρ‚ΠΈΠΏ Π²ΠΈΠ΄Π΅Π½ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ
    name*: string  # ΠΏΠΎΠ»Π΅ этого Ρ‚ΠΈΠΏΠ° Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ
    age*: int


ΠšΠΎΡ€Ρ‚Π΅ΠΆΠΈ tuple


ΠšΠΎΡ€Ρ‚Π΅ΠΆΠΈ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ ΠΏΠΎΡ…ΠΎΠΆΠΈ Π½Π° ΡƒΠΆΠ΅ Π·Π½Π°ΠΊΠΎΠΌΡ‹Π΅ Π²Π°ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. Они ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ-значСниями, ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΏΠΎΠ»Π΅. Однако, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Ρ‚ΠΈΠΏΠΎΠ²-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ ΡΠ²Π»ΡΡŽΡ‚ΡΡ структурными β€” это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ эквивалСнтными, Ссли ΠΎΠ½ΠΈ содСрТат поля ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΈ Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ порядкС.

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ () ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для создания ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ. ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ ΠΏΠΎΠ»Π΅ΠΉ Π² конструкторС Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ порядку Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ°. Но, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², здСсь нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ имя Ρ‚ΠΈΠΏΠ° ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ°.

Как ΠΈ Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², доступ ΠΊ полям ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ° осущСствляСтся Ρ‡Π΅Ρ€Π΅Π· запись t.ΠΏΠΎΠ»Π΅. Однако Ρƒ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ Π΅ΡΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ β€” ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΏΠΎ индСксу: t[i], Π³Π΄Π΅ i Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ цСлочислСнной константой.

type
  # Π’ΠΈΠΏ, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°:
  # состоит ΠΈΠ· ΠΈΠΌΠ΅Π½ΠΈ (name) ΠΈ возраста (age).
  Person = tuple
    name: string
    age: int

  # ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ синтаксис для эквивалСнтного Ρ‚ΠΈΠΏΠ°.
  PersonX = tuple[name: string, age: int]

  # Бинтаксис с Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΌΠΈ полями
  PersonY = (string, int)

var
  person: Person
  personX: PersonX
  personY: PersonY

person = (name: "Peter", age: 30)
# Person ΠΈ PersonX эквивалСнтны
personX = person

# Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ° с Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΌΠΈ полями:
personY = ("Peter", 30)

# ΠšΠΎΡ€Ρ‚Π΅ΠΆ с Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΌΠΈ полями совмСстим с ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΌ,
# Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΅ΡΡ‚ΡŒ ΠΈΠΌΠ΅Π½Π° ΠΏΠΎΠ»Π΅ΠΉ.
person = personY
personY = person

# Часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ сокращённый синтаксис ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ
person = ("Peter", 30)

echo person.name  # "Peter"
echo person.age   # 30

echo person[0]    # "Peter"
echo person[1]    # 30

# ΠšΠΎΡ€Ρ‚Π΅ΠΆΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±Π΅Π· объявлСния ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°.
var building: tuple[street: string, number: int]
building = ("Rue del Percebe", 13)
echo building.street

# Π­Ρ‚Π° строка Π½Π΅ скомпилируСтся β€” ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ²!
# person = building
# --> Error: type mismatch: got (tuple[street: string, number: int])
#     but expected 'Person'
Peter
30
Peter
30
Rue del Percebe

Π₯отя ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ Ρ‚ΠΈΠΏ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ° Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΏΠΎΠ»Π΅ΠΉ ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ, Π΄Π°ΠΆΠ΅ Ссли Ρ‚ΠΈΠΏΡ‹ ΠΏΠΎΠ»Π΅ΠΉ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚.

Распаковка ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ

ΠŸΡ€ΠΈ присваивании ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ β€” это ΡƒΠ΄ΠΎΠ±Π½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ сразу ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ поля ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ. НапримСр, ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° splitFile ΠΈΠ· модуля os Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, имя ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° Π² Π²ΠΈΠ΄Π΅ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ°.

Для распаковки ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ скобки, ΠΈΠ½Π°Ρ‡Π΅ всС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (вСсь ΠΊΠΎΡ€Ρ‚Π΅ΠΆ)! НапримСр:

import std/os

let
  path = "usr/local/nimc.html"
  (dir, name, ext) = splitFile(path)  # βœ… ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π°Ρ распаковка
  baddir, badname, badext = splitFile(path)  # ❌ ΠΠ΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ!

echo dir      # Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ "usr/local"
echo name     # Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ "nimc"
echo ext      # Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ ".html"

# ВсС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ содСрТат ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΊΠΎΡ€Ρ‚Π΅ΠΆ:
echo baddir   # (dir: "usr/local", name: "nimc", ext: ".html")
echo badname  # (Ρ‚ΠΎ ΠΆΠ΅ самоС)
echo badext   # (Ρ‚ΠΎ ΠΆΠ΅ самоС)
usr/local
nimc
.html
(dir: "usr/local", name: "nimc", ext: ".html")
(dir: "usr/local", name: "nimc", ext: ".html")
(dir: "usr/local", name: "nimc", ext: ".html")

Распаковка ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² Ρ†ΠΈΠΊΠ»Π°Ρ… for:

let points = [(10, 'a'), (20, 'b'), (30, 'c')]

for (x, c) in points:
  echo x
# Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚: 10; 20; 30

# МоТно Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ индСкс:
for i, (x, c) in points:
  echo i, c
# Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚: 0a; 1b; 2c
10
20
30
0a
1b
2c

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², поля ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ всСгда ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ β€” ΠΈΡ… Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ явно ΠΏΠΎΠΌΠ΅Ρ‡Π°Ρ‚ΡŒ для экспорта.


БсылочныС ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ref ΠΈ ptr


Бсылки (Ρ‚ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… языках программирования) это способ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ Β«ΠΌΠ½ΠΎΠ³ΠΈΠ΅-ΠΊ-ΠΎΠ΄Π½ΠΎΠΌΡƒΒ». Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·Π½Ρ‹Π΅ ссылки ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ мСсто Π² памяти ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ.

Nim Ρ€Π°Π·Π»ΠΈΡ‡Π°Π΅Ρ‚ отслСТиваСмыС (traced) ΠΈ нСотслСТиваСмыС (untraced) ссылки. НСотслСТиваСмыС ссылки Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ указатСлями. ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ ссылки ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² ΠΊΡƒΡ‡Π΅ со сборкой мусора, нСотслСТиваСмыС – Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΠΎΠ΄ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»Π° Π²Ρ‹Π΄Π΅Π»Π΅Π½Π° Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΈΠ»ΠΈ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… мСстах памяти. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, нСотслСТиваСмыС ссылки нСбСзопасны. Однако для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ (доступа ΠΊ Β«ΠΆΠ΅Π»Π΅Π·ΡƒΒ») ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ Π±Π΅Π· Π½ΠΈΡ… нСльзя.

ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ ссылки ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом ref, нСотслСТиваСмыС – ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом ptr.

ΠŸΡƒΡΡ‚Π°Ρ subscript-нотация [] ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для разымСнования ссылки, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ для получСния элСмСнта, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ссылка. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ . (доступ ΠΊ полю ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ°/ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°) ΠΈ [] (ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ индСксирования массива/строки/ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ) Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ нСявноС Ρ€Π°Π·Ρ‹ΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ для ссылочных Ρ‚ΠΈΠΏΠΎΠ²:

type
  Node = ref NodeObj
  NodeObj = object
    le, ri: Node
    data: int
var
  n: Node
new(n)
n.data = 9
# Π½Π΅ Π½Π°Π΄ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ n[].data, это сильно сбиваСт с Ρ‚ΠΎΠ»ΠΊΡƒ!

Для выдСлСния памяти ΠΏΠΎΠ΄ Π½ΠΎΠ²Ρ‹ΠΉ отслСТиваСмый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ встроСнная ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° new:

var n: Node
new(n)

Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с нСотслСТиваСмой ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ alloc, dealloc ΠΈ realloc. ДокумСнтация модуля std/system содСрТит Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΏΠΎ этим вопросам.

Если ссылка Π½ΠΈ Π½Π° Ρ‡Ρ‚ΠΎ Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΎΠ½Π° ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ nil.


ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ proc


ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ это (нСсколько абстрактный) ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ nil. Nim ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚Π΅Ρ…Π½ΠΈΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

proc greet(name: string): string =
  "ΠŸΡ€ΠΈΠ²Π΅Ρ‚, " & name & "!"

proc bye(name: string): string =
  "Пока, " & name & "."

proc communicate(greeting: proc (x: string): string, name: string) =
  echo greeting(name)

communicate(greet, "Π”ΠΆΠΎΠ½")
communicate(bye, "ΠœΡΡ€ΠΈ")
ΠŸΡ€ΠΈΠ²Π΅Ρ‚, Π”ΠΆΠΎΠ½!
Пока, ΠœΡΡ€ΠΈ.

НСочСвидная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ„ΠΎΡ€ΠΌΠ° Π²Ρ‹Π·ΠΎΠ²Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ влияСт Π½Π° ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ Ρ‚ΠΈΠΏΠΎΠ²: ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ совмСстимы Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΡ‹ Π²Ρ‹Π·ΠΎΠ²Π°. Π Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΡ‹ Π²Ρ‹Π·ΠΎΠ²Π° пСрСчислСны Π² руководствС.


ΠžΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ distinct


ΠžΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ позволяСт ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ ΠΏΠΎΠ΄Ρ‚ΠΈΠΏΠΎΠ²ΠΎΠ³ΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌ ΠΈ Π΅Π³ΠΎ Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ. Π’Π°ΠΌ явно Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ всС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ для ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. Для ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π² этом, ΠΊΠ°ΠΊ ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ, Ρ‚Π°ΠΊ ΠΈ Π΅Π³ΠΎ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ‚ΠΈΠΏ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Π° (type casting).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ прСдоставлСны Π² руководствС.


ΠœΠΎΠ΄ΡƒΠ»ΠΈ


Nim ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ€Π°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° части согласно ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚Ρƒ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ находится Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅. ΠœΠΎΠ΄ΡƒΠ»ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ сокрытиС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΈ Ρ€Π°Π·Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ. Они ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ доступ ΠΊ символам Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ import. Π­ΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π±ΡƒΠ΄ΡƒΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ символы Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня, ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½Π½Ρ‹Π΅ Π·Π²Ρ‘Π·Π΄ΠΎΡ‡ΠΊΠΎΠΉ (*):

# ΠœΠΎΠ΄ΡƒΠ»ΡŒ A
var
  x*, y: int

proc `*` *(a, b: seq[int]): seq[int] =
  # ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ:
  newSeq(result, len(a))
  # ΠΏΠ΅Ρ€Π΅ΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ Π΄Π²Π΅ цСлочислСнных ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ:
  for i in 0..len(a)-1: result[i] = a[i] * b[i]

when isMainModule:
  # ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ``*`` для ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ:
  assert(@[1, 2, 3] * @[1, 2, 3] == @[1, 4, 9])

ΠœΠΎΠ΄ΡƒΠ»ΡŒ A экспортируСт x ΠΈ *, Π½ΠΎ Π½Π΅ y.

ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ ΠΈΡΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ стартС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ слоТных структур Π΄Π°Π½Π½Ρ‹Ρ….

Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅ Π΅ΡΡ‚ΡŒ особая магичСская константа isMainModule, которая истинна, Ссли ΠΌΠΎΠ΄ΡƒΠ»ΡŒ скомпилирован Π² качСствС основного Ρ„Π°ΠΉΠ»Π°. Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ для внСдрСния Π²Π½ΡƒΡ‚Ρ€ΡŒ модуля тСстов, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅.

Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ‹ модуля ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ синтаксиса module.symbol. Если символ Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π΅Π½, ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ. Π‘ΠΈΠΌΠ²ΠΎΠ» являСтся Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½Ρ‹ΠΌ, Ссли ΠΎΠ½ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ Π² Π΄Π²ΡƒΡ… (ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅) Ρ€Π°Π·Π½Ρ‹Ρ… модулях ΠΈ ΠΎΠ±Π° модуля ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ‚Ρ€Π΅Ρ‚ΡŒΠΈΠΌ:

# ΠœΠΎΠ΄ΡƒΠ»ΡŒ A
var x*: string
# ΠœΠΎΠ΄ΡƒΠ»ΡŒ B
var x*: int
# ΠœΠΎΠ΄ΡƒΠ»ΡŒ C
import A, B
write(stdout, x) # ошибка: x Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π΅Π½
write(stdout, A.x) # ошибки Π½Π΅Ρ‚: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€

var x = 4
write(stdout, x) # нСоднозначности Π½Π΅Ρ‚: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ x модуля C

Но это ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Π½Π΅ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ ΠΊ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°ΠΌ ΠΈΠ»ΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌ. Π—Π΄Π΅ΡΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠΈ:

# ΠœΠΎΠ΄ΡƒΠ»ΡŒ A
proc x*(a: int): string = $a
# ΠœΠΎΠ΄ΡƒΠ»ΡŒ B
proc x*(a: string): string = $a
# ΠœΠΎΠ΄ΡƒΠ»ΡŒ C
import A, B
write(stdout, x(3))   # ошибки Π½Π΅Ρ‚: вызываСтся A.x
write(stdout, x(""))  # ошибки Π½Π΅Ρ‚: вызываСтся B.x

proc x*(a: int): string = nil
write(stdout, x(3))   # Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ: ΠΊΠ°ΠΊΠΎΠΉ `x` Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ?


Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ символов except


ΠžΠ±Ρ‹Ρ‡Π½ΠΎ, ΠΊΠΎΠΌΠ°Π½Π΄Π° import Π·Π°Π±ΠΈΡ€Π°Π΅Ρ‚ всС экспортируСмыС символы. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ, ΡƒΠΊΠ°Π·Π°Π² ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹Π΅ символы с ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ except.

import mymodule except y


Команда from


ΠœΡ‹ ΡƒΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ import, ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ всС экспортированныС символы. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ from import - Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ пСрСчислСнныС символы:

from mymodule import x, y, z

Команда from Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ пространства ΠΈΠΌΡ‘Π½ для символов, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ, символы Π±ΡƒΠ΄ΡƒΡ‚ доступны, Π½ΠΎ для ΠΈΡ… использования потрСбуСтся ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€.

from mymodule import x, y, z

x()           # использyeΠΌ x Π±Π΅Π· ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ
from mymodule import nil

mymodule.x()  # Π½ΡƒΠΆΠ½ΠΎ ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ x, ΡƒΠΊΠ°Π·Π°Π² имя модуля Π² качСствС прСфикса

x()           # Ошибка: использованиС x Π±Π΅Π· ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ ошибкС компиляции

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΠΌΠ΅Π½Π° ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ довольно Π΄Π»ΠΈΠ½Π½Ρ‹Π΅, Π²Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅ псСвдонимы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ.

from mymodule as m import nil

m.x()         # m это псСвдоним для mymodule


Команда include


Команда include Π΄Π΅Π»Π°Π΅Ρ‚ Π½Π΅Ρ‡Ρ‚ΠΎ, Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‰Π΅Π΅ΡΡ ΠΎΡ‚ импортирования модуля: ΠΎΠ½Π° вставляСт Π½Π° своё мСсто содСрТимоС Ρ„Π°ΠΉΠ»Π°. Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° вСсьма ΠΏΠΎΠ»Π΅Π·Π½Π° для разбиСния большого модуля Π½Π° нСсколько Ρ„Π°ΠΉΠ»ΠΎΠ²:

include fileA, fileB, fileC
import std/strutils
import pkg/nimib
import ./theme/codeOutput

var nbToc: NbBlock

template addToc =
  newNbBlock("nbText", false, nb, nbToc, ""):
    nbToc.output = "## Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅:\n\n"

template nbNewSection(name:string) =
  let anchorName = name.toLower.replace(" ", "-")
  nbText "<a name=\"" & anchorName & "\"></a>\n<br>\n### " & name & "\n\n---"
  nbToc.output.add "1. <a href=\"#" & anchorName & "\">" & name & "</a>\n"

template nbSubSection(name:string) =
  let anchorName = name.toLower.replace(" ", "-")
  nbText "<a name=\"" & anchorName & "\"></a>\n<br>\n#### " & name & "\n\n---"
  nbToc.output.add "    * <a href=\"#" & anchorName & "\">" & name & "</a>\n"

template nbQuoteBlock(code: untyped) =
  nbText "<blockquote>"
  code
  nbText "</blockquote>"

nbInit # ----------------------------- START ----------------------------------
initCodeTheme()

nbText: """
Π£Ρ‡Π΅Π±Π½ΠΎΠ΅ пособиС ΠΏΠΎ языку Nim (Π§Π°ΡΡ‚ΡŒ I)
======================================

- Автор: Andreas Rumpf
- ВСрсия: 2.1.1
- Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄: [Morthan](https://habr.com/ru/users/Morthan/)
- ΠŸΡ€Π°Π²ΠΊΠΈ, ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅, ΠΏΠΎΡ€Ρ‚ Π½Π° nimib: [janAkali](https://codeberg.org/janAkali)

## Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

>  "Der Mensch ist doch ein Augentier -- SchΓΆne Dinge wΓΌnsch' ich mir."
>
>  (Π¦ΠΈΡ‚Π°Ρ‚Π° ΠΈΠ· пСсни Β«MorgensternΒ» Π³Ρ€ΡƒΠΏΠΏΡ‹ Β«RammsteinΒ». ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄: «Но
Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ – глазастый Π·Π²Π΅Ρ€ΡŒ. МнС Π½ΡƒΠΆΠ½ΠΎ мноТСство красивых Π²Π΅Ρ‰Π΅ΠΉΒ».)

Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ являСтся ΡƒΡ‡Π΅Π±Π½ΠΈΠΊΠΎΠΌ ΠΏΠΎ языку программирования Nim.

Π­Ρ‚ΠΎΡ‚ ΡƒΡ‡Π΅Π±Π½ΠΈΠΊ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π·Π½Π°ΠΊΠΎΠΌΡ‹ с Π±Π°Π·ΠΎΠ²Ρ‹ΠΌΠΈ концСпциями
программирования - ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ, Ρ‚ΠΈΠΏΠ°ΠΌΠΈ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ.

Π’ΠΎΡ‚ нСсколько Π΄Ρ€ΡƒΠ³ΠΈΡ… рСсурсов для изучСния Nim (Π½Π° английском языкС):

  * [Азы Nim](https://narimiran.github.io/nim-basics/) - Π½Π΅ΠΆΠ½ΠΎΠ΅
  Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² упомянутыС Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ
  * [Π’Ρ‹ΡƒΡ‡ΠΈ Nim Π·Π° 5 ΠΌΠΈΠ½ΡƒΡ‚](https://learnxinyminutes.com/docs/nim/) - быстроС
  Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² Nim Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ 5 ΠΌΠΈΠ½ΡƒΡ‚
  * [Руководство ΠΏΠΎ Nim](https://nim-lang.org/docs/manual.html) - Π΅Ρ‰Π΅ большС
  ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹Ρ… возмоТностСй языка

ВсС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎΠ΄Π° Π² этом ΡƒΡ‡Π΅Π±Π½ΠΈΠΊΠ΅, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΠΉΠ΄Π΅Π½Ρ‹ Π² ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΉ
Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Nim, ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ руководству ΠΏΠΎ ΡΡ‚ΠΈΠ»ΡŽ языка Nim."""

addToc()

nbNewSection "Ввоя пСрвая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°"

nbText: """
Начнём с ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ "Hello World":"""

nbCodeSkip:
  # это ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ
  echo "Как тСбя Π·ΠΎΠ²ΡƒΡ‚? "
  var name: string = readLine(stdin)
  echo "ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ", name, "!"

nbText: """
Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚Π΅ этот ΠΊΠΎΠ΄ Π² Ρ„Π°ΠΉΠ» `greetings.nim`. Π’Π΅ΠΏΠ΅Ρ€ΡŒ скомпилируйтС ΠΈ запуститС Π΅Π³ΠΎ:
```bash
$ nim compile --run greetings.nim
```"""

nbQuoteBlock:
  nbText: """
  Π‘ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ
  [`--run`](https://nim-lang.org/docs/nimc.html#compiler-usage-commandminusline-switches")
  Nim автоматичСски выполняСт Ρ„Π°ΠΉΠ» послС Π΅Π³ΠΎ компиляции. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ
  Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, Π΄ΠΎΠ±Π°Π²ΠΈΠ² ΠΈΡ… послС ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π°:
  ```bash
  $ nim compile --run greetings.nim Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚1 Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚2
  ```
  """

nbQuoteBlock:
  nbText:"""
  Π£ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ Π΅ΡΡ‚ΡŒ сокращСния, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅
  Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· этих Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ²:
  ```bash
  $ nim c greetings.nim # ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈ сохраняСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΏΠ°ΠΏΠΊΡƒ
  $ nim c -r greetings.nim # ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΏΠ°ΠΏΠΊΡƒ ΠΈ запускаСт Π΅Ρ‘
  ```

  Eсли Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π½ΠΎ исполняСмый Ρ„Π°ΠΉΠ» Π½Π΅ Π½ΡƒΠΆΠ΅Π½ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€,
  ΠΏΡ€ΠΈ запускС тСстов ΠΈ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΡ… скриптов) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅:
  ```bash
  $ nim r greetings.nim # ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² ΡΠΈΡΡ‚Π΅ΠΌΠ½ΡƒΡŽ кСш ΠΏΠ°ΠΏΠΊΡƒ ΠΈ запускаСт Π΅Ρ‘
  ```
  ВсС доступныС ΠΊΠΎΠΌΠΌΠ°Π½Π΄Ρ‹, ΠΊΠ»ΡŽΡ‡ΠΈ ΠΈ сокращСния ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² Π²Ρ‹Π²ΠΎΠ΄Π΅ ΠΊΠΎΠΌΠΌΠ°Π½Π΄Ρ‹:
  ```bash
  $ nim --fullhelp
  ```
  """

nbQuoteBlock:
  nbText:"""
  По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Nim ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠ΄ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ **ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ** (debug), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ
  Ρ€Π΅Π»ΠΈΠ·Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ - ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠ»ΡŽΡ‡ `-d:release`, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ:
  ```bash
  $ nim compile -d:release --run greetings.nim
  ```

  Для Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠΈΠ½Π³Π° ΠΈ ΠΊΠΎΠ΄Π° Π² ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠ»ΡŽΡ‡ `-d:release`. Для
  сравнСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ с "нСбСзопасными" языками, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ C,
  ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΡŒ `-d:danger`, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡ΠΈΠΌΡ‹Π΅, сопоставимыС
  Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Nim ΠΊΠΎΠ΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ
  ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°ΠΌΠΈ выполнСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π°ΠΆΠ΅ Π½Π΅ доступны для C.
  """

nbText:"""
Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ наша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ довольно ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Π½ΠΎ я объясню
синтаксис: ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, написанныС Π±Π΅Π· отступа, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ стартС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.
Nim Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ отступов. ΠžΡ‚ΡΡ‚ΡƒΠΏΡ‹ Π΄Π΅Π»Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΠ±Π΅Π»Π°ΠΌΠΈ,
табуляция Π½Π΅ допускаСтся.

Π‘Ρ‚Ρ€ΠΎΠΊΠΎΠ²Ρ‹Π΅ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ ΠΎΠ±Ρ€Π°ΠΌΠ»ΡΡŽΡ‚ΡΡ Π΄Π²ΠΎΠΉΠ½Ρ‹ΠΌΠΈ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°ΠΌΠΈ. Команда `var` ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ Π½ΠΎΠ²ΡƒΡŽ
ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ с ΠΈΠΌΠ΅Π½Π΅ΠΌ `name` ΠΈ Ρ‚ΠΈΠΏΠΎΠΌ `string`, послС Ρ‡Π΅Π³ΠΎ Π΅ΠΉ присваиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅,
ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²Π΅Ρ€Π½ΡƒΠ»Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° `readLine`. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ компилятор Π·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ `readLine`
Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ строку, Ρ‚ΠΈΠΏ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ (это называСтся Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ Π²Ρ‹Π²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΈΠΏΠΎΠ²).
ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ:"""

nbCodeSkip:
  var name = readLine(stdin)

nbQuoteBlock:
  nbText:"""
  ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ – это ΠΏΠΎΡ‡Ρ‚ΠΈ СдинствСнная Ρ„ΠΎΡ€ΠΌΠ° вывСдСния Ρ‚ΠΈΠΏΠΎΠ²,
  ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ Π² Nim: это Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ компромисс ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΡ€Π°Ρ‚ΠΊΠΎΡΡ‚ΡŒΡŽ ΠΈ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒΡŽ.
  """

nbText:"""
Наша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° "hello world" содСрТит Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΆΠ΅ извСстны
компилятору: `echo`, `readLine` ΠΈ Ρ‚.Π΄. Π­Ρ‚ΠΈ встроСнныС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅
`std/system`, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ нСявно импортируСтся Π»ΡŽΠ±Ρ‹ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ. ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈΠ·
этого модуля всСгда доступны.
"""

nbNewSection "ЛСксичСскиС Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹"

nbText:"""
Рассмотрим лСксичСскиС элСмСнты Nim ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅. Как ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ языки
программирования, Nim состоит ΠΈΠ· Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΎΠ², ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ², ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов,
ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π², ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΈ Π·Π½Π°ΠΊΠΎΠ² ΠΏΡƒΠ½ΠΊΡ‚ΡƒΠ°Ρ†ΠΈΠΈ."""

nbSubSection "Π‘Ρ‚Ρ€ΠΎΠΊΠΎΠ²Ρ‹Π΅ ΠΈ ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹"

nbText:"""
Π‘Ρ‚Ρ€ΠΎΠΊΠΎΠ²Ρ‹Π΅ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ Π·Π°ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ Π² Π΄Π²ΠΎΠΉΠ½Ρ‹Π΅ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ `"`; ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ – Π² ΠΎΠ΄ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ `'`.
Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ символы ΡΠΊΡ€Π°Π½ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΌ слэшСм `\`; `\n` ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ строки,
`\t` – Ρ‚Π°Π±ΡƒΠ»ΡΡ†ΠΈΡŽ ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

Π’Π°ΠΊΠΆΠ΅ Π±Ρ‹Π²Π°ΡŽΡ‚ сырыС (raw) строковыС Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹:"""

nbCodeSkip:
  r"C:\program files\nim"

nbText: """
Π’ сырых Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π°Ρ… ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ слэш Π½Π΅ являСтся ΡΠΊΡ€Π°Π½ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ символом.

Π’Ρ€Π΅Ρ‚ΠΈΠΉ ΠΈ послСдний способ записи строковых Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΎΠ², это Π΄Π»ΠΈΠ½Π½Ρ‹Π΅ строковыС
Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹. Они ΠΎΠ±Ρ€Π°ΠΌΠ»ΡΡŽΡ‚ΡΡ Ρ‚Ρ€ΠΎΠΉΠ½Ρ‹ΠΌΠΈ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°ΠΌΠΈ: """ & "`\"\"\"...\"\"\"`" & """,
ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ строки, ΠΈ `\` Π² Π½ΠΈΡ… Π½Π΅ являСтся ΡΠΊΡ€Π°Π½ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ символом. Они
ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² ΠΊΠΎΠ΄ HTML-Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ²."""

nbSubSection "ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ"

nbText: """
ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π³Π΄Π΅ ΡƒΠ³ΠΎΠ΄Π½ΠΎ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ строкового ΠΈΠ»ΠΈ символьного Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π° ΠΈ
начинаСтся с символа Ρ€Π΅ΡˆΡ‘Ρ‚ΠΊΠΈ #. Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с ##:"""
nbCodeSkip:
  # ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ.
  var myVariable: int ## Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

nbText: """
Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΠΊΠ΅Π½Π°ΠΌΠΈ, входят Π² синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ
ΠΈ, поэтому, ΠΌΠΎΠ³ΡƒΡ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… мСстах Ρ„Π°ΠΉΠ»Π°! Π­Ρ‚ΠΎ позволяСт
ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

ΠœΠ½ΠΎΠ³ΠΎΡΡ‚Ρ€ΠΎΡ‡Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с `#[` ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‚ΡΡ `]#`.
ΠœΠ½ΠΎΠ³ΠΎΡΡ‚Ρ€ΠΎΡ‡Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ:"""

nbCodeSkip:
  ##[ ΠœΠ½ΠΎΠ³ΠΎΡΡ‚Ρ€ΠΎΡ‡Π½Ρ‹ΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ ]##
  #[
    Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ любой тСкст Π²Π½ΡƒΡ‚Ρ€ΠΈ этого Π±Π»ΠΎΠΊΠ°
    Π±Π΅Π· ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ отступам.
       yes("МоТно Π»ΠΈ Π·Π°Π΄Π°Ρ‚ΡŒ бСссмыслСнный вопрос?")
    #[
       Π—Π°ΠΌΠ΅Ρ‚ΠΊΠ°: этот ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ!
    ]#
  ]#
  discard """Π‘Ρ‚Π°Ρ€Ρ‹ΠΉ ΡΡ‚ΠΈΠ»ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π², Π½Π΅ рСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ."""

nbSubSection "Числа"

nbText:"""
ЧислСнныС Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ ΠΏΠΈΡˆΡƒΡ‚ΡΡ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ Π΄Ρ€ΡƒΠ³ΠΈΡ… языков. Для
ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ Ρ‡ΠΈΡ‚Π°Π±Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ Ρ€Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒ разряды подчёркиваниями: `1_000_000`
(ΠΎΠ΄ΠΈΠ½ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½).

Числа, содСрТащиС Ρ‚ΠΎΡ‡ΠΊΡƒ (ΠΈΠ»ΠΈ `e`, ΠΈΠ»ΠΈ `E`) ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π°ΠΌΠΈ
чисСл с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой: `1.0e9` (ΠΎΠ΄ΠΈΠ½ ΠΌΠΈΠ»Π»ΠΈΠ°Ρ€Π΄).

ШСстнадцатСричныС Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹
Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с прСфикса `0x`, Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Π΅ – с `0b`, Π° Π²ΠΎΡΡŒΠΌΠ΅Ρ€ΠΈΡ‡Π½Ρ‹Π΅ – с `0o`. Π’Π΅Π΄ΡƒΡ‰ΠΈΠΉ ноль
Π±Π΅Π· 'ΠΎ' Π½Π΅ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ число Π² Π²ΠΎΡΡŒΠΌΠ΅Ρ€ΠΈΡ‡Π½ΠΎΠ΅."""

nbNewSection "ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ `var`"

nbText:"""
Команда var ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ Π½ΠΎΠ²ΡƒΡŽ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ»ΠΈ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ:"""
nbCodeSkip:
  var x, y: int # ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ x ΠΈ y, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ Ρ‚ΠΈΠΏ `int`

nbNewSection "ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ `let`"

nbText:"""
Команда let Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΠΊΠ°ΠΊ `var`, Π½ΠΎ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ **ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠ³ΠΎ
присваивания**: послС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ:"""

nbCodeSkip:
  let x = "abc" # Π²Π²ΠΎΠ΄ΠΈΡ‚ Π½ΠΎΠ²ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ `x` ΠΈ присваиваСт Π΅ΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
  x = "xyz"     # Π½Π΅ сработаСт: Π²Ρ‚ΠΎΡ€ΠΎΠ΅ присваиваниС `x`

nbQuoteBlock:
  nbText: """
  Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ отступов послС ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Ρ†Π΅Π»ΡƒΡŽ ΡΠ΅ΠΊΡ†ΠΈΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ
  констант:"""

  nbCodeSkip:
    let # Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ `var` ΠΈ `const`
      x, y: int
      # здСсь Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ
      m, n, o: string

nbNewSection "ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Ρ‹"

nbText: """
ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Ρ‹ - это символы, связанныС со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ константы Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ.
Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² объявлСнии константы обязано Π±Ρ‹Ρ‚ΡŒ вычисляСмым Π½Π° этапС компиляции! :"""

nbCodeSkip:
  var a = 5
  const
    x = "abc" # константа x содСрТит строку "abc"
    b = 1
    c = b + 5 # Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ вычислСния извСстСн Π½Π° этапС компиляции
    d = a + 3 # Π½Π΅ сработаСт: Π½Π° этапС компиляции Π½Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…

nbQuoteBlock:
  nbText: """
  Π Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ let ΠΈ const ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅: let Π²Π²ΠΎΠ΄ΠΈΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, которая Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚
  Π±Ρ‹Ρ‚ΡŒ пСрСприсвоСна, Π° const ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Β«ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Π²ΠΎ врСмя
  компиляции ΠΈ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² ΡΠ΅ΠΊΡ†ΠΈΡŽ Π΄Π°Π½Π½Ρ‹Ρ…Β»:"""

  nbCodeSkip:
    const input = readLine(stdin) # Ошибка: прСдполагаСтся константноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅
    let input = readLine(stdin)   # Π° это сработаСт

nbNewSection "Команда присваивания"

nbText:"""
Команда присваивания Π·Π°Π΄Π°Π΅Ρ‚ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ, Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС, мСсту
хранСния:"""

nbCodeSkip:
  var x = "abc" # Π²Π²ΠΎΠ΄ΠΈΡ‚ Π½ΠΎΠ²ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ `x` ΠΈ присваиваСт Π΅ΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
  x = "xyz"     # присваиваСт Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ `x`

nbText: """
`=` - это ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания."""

nbQuoteBlock:
  nbText: """
  ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ `=` нСльзя ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ, ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈΠ»ΠΈ Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒ, Π½ΠΎ это ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒΡΡ Π²
  Π±ΡƒΠ΄ΡƒΡ‰ΠΈΡ… вСрсиях Nim."""

nbText: """
Π’ ΠΎΠ΄Π½ΠΎΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ присваивания ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ нСсколько ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… β€” всС ΠΎΠ½ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚
ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:"""

nbCodeInBlock:
  var x, y = 3 # присваиваСт ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ `x` ΠΈ `y` Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 3
  echo "x ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ", x
  echo "y ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ", y
  x = 42       # измСняСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ `x` Π½Π° 42, Π½Π΅ мСняя `y`
  echo "x ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ", x
  echo "y ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ", y

nbNewSection "ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ управлСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ"

nbText:"""
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° привСтствия содСрТит Ρ‚Ρ€ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ.

Но Ρ‚Π°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΌΠΎΠ³ΡƒΡ‚ лишь самыС ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π±ΠΎΠ»Π΅Π΅ слоТным Π½ΡƒΠΆΠ½Ρ‹ Π΅Ρ‰Ρ‘ Ρ†ΠΈΠΊΠ»Ρ‹ ΠΈ
вСтвлСния."""

nbSubSection "Команда `if`"

nbText:"""
Команда if – ΠΎΠ΄ΠΈΠ½ ΠΈΠ· способов ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π΅Ρ‚Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° выполнСния:"""

nbCodeSkip:
  let name = readLine(stdin)
  if name == "":
    echo "БСдняга, Ρ‚Ρ‹ потСрял своё имя?"
  elif name == "имя":
    echo "ΠžΡ‡Π΅Π½ΡŒ смСшно, тСбя Π·ΠΎΠ²ΡƒΡ‚ имя."
  else:
    echo "ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ", name, "!"

nbText: """
Π’Π΅Ρ‚ΠΎΠΊ `elif` ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ноль ΠΈ Π±ΠΎΠ»Π΅Π΅, Π²Π΅Ρ‚ΠΊΠ° `else` Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°.

ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово `elif` являСтся сокращСниСм `else if`, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΠ·Π»ΠΈΡˆΠ½ΠΈΡ… отступов.
(`""` это пустая строка, ΠΎΠ½Π° Π½Π΅ содСрТит символов.)"""

nbSubSection "Команда `case`"

nbText: """
Π”Ρ€ΡƒΠ³ΠΎΠΉ способ вСтвлСния рСализуСтся ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ case. Она раздСляСт ΠΏΠΎΡ‚ΠΎΠΊ выполнСния Π½Π°
нСсколько Π²Π΅Ρ‚ΠΎΠΊ:"""

nbCodeSkip:
  let name = readLine(stdin)
  case name
  of "":
    echo "БСдняга, Ρ‚Ρ‹ потСрял своё имя?"
  of "name":
    echo "ΠžΡ‡Π΅Π½ΡŒ смСшно, тСбя Π·ΠΎΠ²ΡƒΡ‚ имя."
  of "Dave", "Frank":
    echo "ΠšΡ€ΡƒΡ‚ΠΎΠ΅ имя!"
  else:
    echo "ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ", name, "!"

nbText:"""
Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° для `of` ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ список Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Ρ€Π°Π·Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ…
запятыми.

Команда `case` ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Ρ†Π΅Π»Ρ‹ΠΌΠΈ числами, Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ пСрСчислимыми Ρ‚ΠΈΠΏΠ°ΠΌΠΈ ΠΈ
строками. (Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ пСрСчислимыС Ρ‚ΠΈΠΏΡ‹ Π±ΡƒΠ΄Π΅Ρ‚ рассказано ΠΏΠΎΠ·ΠΆΠ΅.) Для Ρ†Π΅Π»Ρ‹Ρ… чисСл
ΠΈ пСрСчислимых Ρ‚ΠΈΠΏΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ‹ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ:"""

nbCodeSkip:
  # этa ΠΊΠΎΠΌΠ°Π½Π΄a Π±ΡƒΠ΄Π΅Ρ‚ объяснСна ΠΏΠΎΠ·ΠΆΠ΅:
  from strutils import parseInt

  echo("Назови число: ")
  let n = parseInt(readLine(stdin))
  case n
  of 0..2, 4..7: echo("Π­Ρ‚ΠΎ число ΠΈΠ· мноТСства: {0, 1, 2, 4, 5, 6, 7}")
  of 3, 8: echo("Π­Ρ‚ΠΎ число Π»ΠΈΠ±ΠΎ 3, Π»ΠΈΠ±ΠΎ 8")

nbText:"""
Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, ΠΊΠΎΠ΄ Π²Ρ‹ΡˆΠ΅ **Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ**. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½Π°Π΄ΠΎ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΡŒ
всС значСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ `n`, Π° ΠΊΠΎΠ΄ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ значСния
`0..8`.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ, Π½Π΅ слишком ΠΏΡ€Π°ΠΊΡ‚ΠΈΡ‡Π½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Ρ†Π΅Π»Ρ‹Π΅ числа
(хотя Ρ‚Π°ΠΊΠΎΠ΅ ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, благодаря Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ²), ΠΌΡ‹ исправим это, ΡƒΠΊΠ°Π·Π°Π²
компилятору, Ρ‡Ρ‚ΠΎ для всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π½ΠΈΡ‡Π΅Π³ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ:"""

nbCodeSkip:
  case n
  of 0..2, 4..7: echo("Π­Ρ‚ΠΎ число ΠΈΠ· мноТСства: {0, 1, 2, 4, 5, 6, 7}")
  of 3, 8: echo("Π­Ρ‚ΠΎ число Π»ΠΈΠ±ΠΎ 3, Π»ΠΈΠ±ΠΎ 8")
  else: discard

nbText:"""
ΠŸΡƒΡΡ‚Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° `discard` это ΠΊΠΎΠΌΠ°Π½Π΄Π° Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°Ρ‚ΡŒ.

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Π·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° `case` с сСкциСй `else` ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ ΠΈ,
Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ,ошибка исчСзаСт. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ всС строковыС значСния ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΡŒ
Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ: Π²ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π² случаС строк, Π²Π΅Ρ‚ΠΊΠ° `else` ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°.

Π’ Ρ†Π΅Π»ΠΎΠΌ, ΠΊΠΎΠΌΠ°Π½Π΄Π° `case` ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ² Ρ‚ΠΈΠΏΠΎΠ² ΠΈ пСрСчислСний. Π’ΠΎ Ρ‡Ρ‚ΠΎ
компилятор провСряСт ΠΎΡ…Π²Π°Ρ‚ всСх Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ - ΠΎΡ‡Π΅Π½ΡŒ полСзная Π²Π΅Ρ‰ΡŒ."""

nbSubSection "Команда `while`"

nbText:"""
Команда while прСдставляСт собой простой Ρ†ΠΈΠΊΠ»:"""

nbCodeSkip:
  echo "Как тСбя Π·ΠΎΠ²ΡƒΡ‚? "
  var name = readLine(stdin)
  while name == "":
    echo "ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, Π½Π°Π·ΠΎΠ²ΠΈ своё имя: "
    name = readLine(stdin) # `var` отсутствуСт, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ
                           # здСсь Π½Π΅ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ новая пСрСмСнная

nbText:"""
Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, Ρ†ΠΈΠΊΠ» `while` использован, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π΅Π³ΠΎ имя Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€,
ΠΏΠΎΠΊΠ° ΠΎΠ½ Π½Π΅ Π½Π°ΠΆΠΌΡ‘Ρ‚ Enter (Ρ‚.Π΅. Π½Π΅ Π²Π²Π΅Π΄Ρ‘Ρ‚ ΠΏΡƒΡΡ‚ΡƒΡŽ строку)."""

nbSubSection "Команда `for`"

nbText:"""
Команда `for` Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Ρ†ΠΈΠΊΠ» ΠΏΠΎ всСм элСмСнтам ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования
встроСнного ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° `countup`:"""

nbCodeInBlock:
  echo "Π‘Ρ‡ΠΈΡ‚Π°Π΅ΠΌ Π΄ΠΎ 5: "
  for i in countup(1, 5):
    echo i

nbText:"""
ВстроСнный ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ `$` ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Ρ†Π΅Π»ΠΎΠ΅ число (int) ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ Π² строку.

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ i нСявно ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ Ρ†ΠΈΠΊΠ»ΠΎΠΌ for ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ int, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ countup Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚
ΠΈΠΌΠ΅Π½Π½ΠΎ этот Ρ‚ΠΈΠΏ. i ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎ значСниям 1, 2, .., 5.

КаТдоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ выводится с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ echo. Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ Π΄Π΅Π»Π°Π΅Ρ‚ Ρ‚ΠΎ ΠΆΠ΅ самоС:"""

nbCodeInBlock:
  echo "Π‘Ρ‡ΠΈΡ‚Π°Π΅ΠΌ Π΄ΠΎ 5: "
  var i = 1
  while i <= 5:
    echo i
    inc i # ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ i Π½Π° 1

nbQuoteBlock:
  nbText: """
  ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ отсчёт с ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ часто Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ…, Π² Nim Ρ‚Π°ΠΊΠΆΠ΅
  Π΅ΡΡ‚ΡŒ `..` ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄Π΅Π»Π°Π΅Ρ‚ Ρ‚ΠΎΠΆΠ΅ самоС Ρ‡Ρ‚ΠΎ ΠΈ `countup`:"""

  nbCodeSkip:
    for i in 1 .. 5:
      echo i

nbText:"""
ΠžΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ отсчёт рСализуСтся ΡΡ‚ΠΎΠ»ΡŒ ΠΆΠ΅ просто (хотя ΠΎΠ½ Π½Π΅ Ρ‚Π°ΠΊ часто Π½ΡƒΠΆΠ΅Π½):"""

nbCode:
  echo "Π‘Ρ‡ΠΈΡ‚Π°Π΅ΠΌ ΠΎΡ‚ 5 Π΄ΠΎ 1: "
  for i in countdown(5, 1):
    echo i

nbText:"""
0-индСксированный счёт ΠΈΠΌΠ΅Π΅Ρ‚ 2 ΡƒΠ΄ΠΎΠ±Π½Ρ‹Ρ… сокращСния `..<` ΠΈ `.. ^1` (ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ
индСкса) Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ счёт Π΄ΠΎ индСкса Π½Π° ΠΎΠ΄ΠΈΠ½ мСньшС Ρ‡Π΅ΠΌ Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ ΠΏΡ€Π΅Π΄Π΅Π»:"""

nbCode:
  for i in 0 ..< 3: # Ρ‚ΠΎ ΠΆΠ΅ самоС Ρ‡Ρ‚ΠΎ ΠΈ 0 .. 2
    echo i

nbCode:
  var s = "Hello"
  for i in 0 ..< s.len:
    echo i

nbCodeInBlock:
  var s = "Hello"
  for idx, c in s[0 .. ^1]: # ^1 это послСдний элСмСнт, ^2 - прСдпослСдний, ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅
    echo idx, ": ", c

nbText: """
Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹e ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ для ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΉ (Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ массивы ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ):
    * `items` and `mitems`, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ нСизмСняСмыС ΠΈ измСняСмыС элСмСнты
    * соотвСтствСнно, ΠΈ
    * `pairs` and `mpairs` ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ индСкс ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта ΠΈ сам элСмСнт
    * (нСизмСняСмыС ΠΈ измСняСмыС, соотвСтствСнно)
"""

nbCode:
  for index, item in ["a","b"].pairs:
    echo item, " Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ", index

nbNewSection "ΠžΠ±Π»Π°ΡΡ‚ΠΈ видимости ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° `block`"

nbText:"""
Π£ ΠΊΠΎΠΌΠ°Π½Π΄ управлСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ Π΅ΡΡ‚ΡŒ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΠΊΠ° Π½Π΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ: ΠΎΠ½ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚
Π½ΠΎΠ²ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ x нСдоступна Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ
Ρ†ΠΈΠΊΠ»Π°:"""

nbCodeSkip:
  while false:
    var x = "hi"
  echo(x) # Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

nbText:"""
Команда `while` создаёт нСявный Π±Π»ΠΎΠΊ. Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ Π²ΠΈΠ΄ΠΈΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ‚ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°, Π²
ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹. ΠšΠΎΠΌΠ°Π½Π΄Ρƒ `block` ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ Π±Π»ΠΎΠΊ
явно:"""

nbCodeSkip:
  block myblock:
    var x = "hi"
  echo(x) # Ρ‚ΠΎΠΆΠ΅ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

nbText:"""
ΠœΠ΅Ρ‚ΠΊΠ° Π±Π»ΠΎΠΊΠ° (`myblock` Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅) Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°."""

nbSubSection "Команда `break`"

nbText:"""
Из Π±Π»ΠΎΠΊΠ° ΠΌΠΎΠΆΠ½ΠΎ досрочно Π²Ρ‹ΠΉΡ‚ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ `break`. Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄
`while`, `for` ΠΈΠ»ΠΈ `block`. Она Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· блиТайшСй Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ конструкции, Ссли Π½Π΅
Π·Π°Π΄Π°Π½Π° ΠΌΠ΅Ρ‚ΠΊΠ° Π±Π»ΠΎΠΊΠ°, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½Π°Π΄ΠΎ Π²Ρ‹ΠΉΡ‚ΠΈ:"""

nbCode:
  block myblock:
    echo "Π²Ρ…ΠΎΠ΄ΠΈΠΌ Π² Π±Π»ΠΎΠΊ"
    while true:
      echo "Ρ†ΠΈΠΊΠ»"
      break # ΠΏΠΎΠΊΠΈΠ΄Π°Π΅ΠΌ Ρ†ΠΈΠΊΠ», Π½ΠΎ Π½Π΅ Π±Π»ΠΎΠΊ
    echo "ΠΌΡ‹ всё Π΅Ρ‰Ρ‘ Π² Π±Π»ΠΎΠΊΠ΅"
  echo "ΡƒΠΆΠ΅ Π²Π½Π΅ Π±Π»ΠΎΠΊΠ°"

nbCode:
  block myblock2:
    echo "Π²Ρ…ΠΎΠ΄ΠΈΠΌ Π² Π±Π»ΠΎΠΊ"
    while true:
      echo "Ρ†ΠΈΠΊΠ»"
      break myblock2 # ΠΏΠΎΠΊΠΈΠ΄Π°Π΅ΠΌ Π½Π°Π·Π²Π°Π½Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ (ΠΈ Ρ†ΠΈΠΊΠ»)
    echo "ΠΌΡ‹ всё Π΅Ρ‰Ρ‘ Π² Π±Π»ΠΎΠΊΠ΅"
  echo "ΡƒΠΆΠ΅ Π²Π½Π΅ Π±Π»ΠΎΠΊΠ°"

nbSubSection "Команда `continue`"

nbText:"""
Как ΠΈ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… языках программирования, ΠΊΠΎΠΌΠ°Π½Π΄Π° `continue` Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ
ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ:"""

nbCode:
  for i in 1 .. 5:
    if i <= 3: continue
    echo i

nbSubSection "Команда `when`"

nbText:"""
ΠŸΡ€ΠΈΠΌΠ΅Ρ€:"""

nbCodeSkip:
  when system.hostOS == "windows":
    echo("это Windows ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€!")
  elif system.hostOS == "linux":
    echo("это Linux ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€!")
  elif system.hostOS == "macosx":
    echo("это Mac OS X!")
  else:
    echo("нСизвСстная опСрационная систСма")

nbText:"""
Команда `when` ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π΅ `if`, Π½ΠΎ Π΅ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ различия:

  - ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ условиС Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ константным Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ вычисляСтся компилятором;
  - ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π²Π΅Ρ‚ΠΊΠΈ Π½Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ Π½ΠΎΠ²ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости;
  - компилятор провСряСт синтаксис ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠ΄ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΊΠΎΠΌΠ°Π½Π΄, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΡ… Π²Π΅Ρ‚ΠΊΠ΅
    ΠΏΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ ΡƒΡΠ»ΠΎΠ²ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²Π΅Ρ€Π½ΡƒΠ»ΠΎ true."""

nbQuoteBlock:
  nbText: """
  Команда `when` ΠΏΠΎΠ»Π΅Π·Π½Π° для написания ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½ΠΎ-зависимого ΠΊΠΎΠ΄Π°, ΠΏΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ с
  конструкциСй `#ifdef` языка C."""

nbNewSection "ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈ отступы"

nbText:"""
Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ рассмотрСли Π±Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ управлСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ вСрнёмся ΠΊ
ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ отступов Nim.

Π’ Nim Π΅ΡΡ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ простыми ΠΈ слоТными ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ:

ΠŸΡ€ΠΎΡΡ‚Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ присваиваниС, Π²Ρ‹Π·ΠΎΠ² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° `return`, Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚
ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΊΠΎΠΌΠ°Π½Π΄.

Π‘Π»ΠΎΠΆΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ `if`, `when`, `for`, `while` ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹.
Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ нСоднозначности слоТныС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ всСгда ΠΏΠΈΡˆΡƒΡ‚ΡΡ с отступом, Π° простыС –
Π½Π΅Ρ‚:"""

nbCodeSkip:
  var x, y = true

  # для ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠ³ΠΎ присваивания отступ Π½Π΅ Π½ΡƒΠΆΠ΅Π½:"
  if x: x = false

  # Π½ΡƒΠΆΠ΅Π½ отступ для Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ if:
  if x:
    if y:
      y = false
    else:
      y = true

  # Π½ΡƒΠΆΠ΅Π½ отступ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π΄Π²Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ΡƒΡΠ»ΠΎΠ²ΠΈΡŽ:
  if x:
    x = false
    y = false

nbText:"""
Части ΠΊΠΎΠΌΠ°Π½Π΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π΄Π°ΡŽΡ‚ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π½Π΅ΠΊΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ выраТСниями. Для
ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ читаСмости ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ отступы Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… мСстах:"""

nbCodeSkip:
  if thisIsaLongCondition() and
      thisIsAnotherLongCondition(1,
         2, 3, 4):
    x = true

nbText:"""
Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, отступы Π² выраТСниях, Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹ послС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², послС открытия скобок ΠΈ
послС запятых.

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ скобок ΠΈ Ρ‚ΠΎΡ‡Π΅ΠΊ с запятой `(;)` Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Ρ‚Π°ΠΌ, Π³Π΄Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹
Ρ‚ΠΎΠ»ΡŒΠΊΠΎ выраТСния:"""

nbCodeInBlock:
  # вычисляСм fac(4) Π½Π° этапС компиляции:
  const fac4 = (var x = 1; for i in 1..4: x *= i; x)
  echo "Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π» числа 4 Ρ€Π°Π²Π΅Π½ ", fac4

nbNewSection "ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹"

nbText:"""
Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ `echo` ΠΈ `readLine` ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ², Π½Π°ΠΌ понадобятся
ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹. (Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… языках ΠΎΠ½ΠΈ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ ΠΈΠ»ΠΈ функциями.) Π’ Nim Π½ΠΎΠ²Ρ‹Π΅
ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова `proc`:"""

nbCodeSkip:
  proc yes(question: string): bool =
    echo(question, " (Π΄/Π½)")
    while true:
      case readLine(stdin)
      of "Π΄", "Π”", "Π΄Π°", "Π”Π°": return true
      of "Π½", "Н", "Π½Π΅Ρ‚", "НСт": return false
      else: echo("ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, Π±ΡƒΠ΄ΡŒΡ‚Π΅ яснСС: Π΄Π° ΠΈΠ»ΠΈ Π½Π΅Ρ‚?")

  if yes("Π£Π΄Π°Π»ΠΈΡ‚ΡŒ всС Π²Π°ΠΆΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅?"):
    echo("Извини, Π”Π΅ΠΉΠ², я боюсь, я Π½Π΅ ΠΌΠΎΠ³Ρƒ этого ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ.")
  else:
    echo("Π― Π΄ΡƒΠΌΠ°ΡŽ Ρ‚Ρ‹ знаСшь Π² Ρ‡Π΅ΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π½Π΅ Ρ…ΡƒΠΆΠ΅ мСня.")

nbText:"""
Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ `yes`, которая Π·Π°Π΄Π°Ρ‘Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ вопрос ΠΈ
Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ `true`, Ссли ΠΎΠ½ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΠ» Β«Π”Π°Β», ΠΈ `false`, Ссли ΠΎΠ½ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΠ» «НСт».

Команда `return` ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠΌΡƒ Π²Ρ‹Ρ…ΠΎΠ΄Ρƒ ΠΈΠ· ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ (ΠΈ, соотвСтствСнно, Ρ†ΠΈΠΊΠ»Π°
`while`).

Бинтаксис `(question: string): bool` ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ с
ΠΈΠΌΠ΅Π½Π΅ΠΌ `question`, Ρ‚ΠΈΠΏΠΎΠΌ `string` ΠΈ Π²Π΅Ρ€Π½Ρ‘Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° `bool`.

`bool` это встроСнный Ρ‚ΠΈΠΏ, СдинствСнныС значСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, это `true` ΠΈ
`false`. Условия Π² ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ… `if` ΠΈΠ»ΠΈ `while` Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΈΠΏ `bool`."""

nbQuoteBlock:
  nbText:"""
НСмного Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠ»ΠΎΠ³ΠΈΠΈ: Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, `question` Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ называСтся ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ, Π° `"Π£Π΄Π°Π»ΠΈΡ‚ΡŒ всС..."`
– это Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ пСрСдаётся Π² этому ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ."""

nbSubSection "ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ `result`"

nbText:"""
Π’ любой ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π΅ΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, нСявно ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ пСрСмСнная `result`, которая
прСдставляСт собой Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

Команда `return` Π±Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² это просто сокращСниС для `return result`.

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ `result` всСгда возвращаСтся ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΈΠ· ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹, Π΄Π°ΠΆΠ΅ Ссли ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
`return` Π½Π΅ Π±Ρ‹Π»ΠΎ."""

nbCodeSkip:
  proc sumTillNegative(x: varargs[int]): int =
    for i in x:
      if i < 0:
        return
      result = result + i

  echo sumTillNegative() # Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ 0
  echo sumTillNegative(3, 4, 5) # Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ 12
  echo sumTillNegative(3, 4 , -1 , 6) # Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ 7

nbText:"""
На ΠΌΠΎΠΌΠ΅Π½Ρ‚ старта Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ пСрСмСнная `result` всСгда ΡƒΠΆΠ΅ объявлСна, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ°
ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ Π΅Ρ‘ снова, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ `var result`, ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ Π΅Ρ‘ Π·Π°Ρ‚Π΅Π½Π΅Π½ΠΈΡŽ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ
ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ с Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ.

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ `result` всСгда инициализируСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для своСго Ρ‚ΠΈΠΏΠ°.
ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ссылочныС Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ `nil`, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΈΡ…, ΠΏΡ€ΠΈ нСобходимости,
придётся ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ.

ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ `return` ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΡƒΡŽ `result`
ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ - Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ своСго послСднСго выраТСния. НапримСр, эта ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°:"""

nbCode:
  proc helloWorld(): string =
    "Hello, World!"

nbText: """
Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ строку "Hello, World!":"""

nbCode:
  echo helloWorld()

nbSubSection "ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹"

nbText:"""
Π’ Ρ‚Π΅Π»Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ константами. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡ… нСльзя
ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ, это Π΄Π°Ρ‘Ρ‚ компилятору Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅
эффСктивным способом.

Если Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Π½ΡƒΠΆΠ½Π° измСняСмая пСрСмСнная, Π΅Ρ‘ слСдуСт ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ Π² Ρ‚Π΅Π»Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ с
ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ `var`. Π—Π°Ρ‚Π΅Π½Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈ являСтся ΠΈΠ΄ΠΈΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½Ρ‹ΠΌ:"""

nbCodeSkip:
  proc printSeq(s: seq, nprinted: int = -1) =
    var nprinted = if nprinted == -1: s.len else: min(nprinted, s.len)
    for i in 0 .. <nprinted:
      echo s[i]

nbText:"""
Если ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π²Ρ‹Π·Π²Π°Π²ΡˆΠ΅ΠΌΡƒ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ
`var` ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€:"""

nbCode:
  proc divmod(a, b: int; res, remainder: var int) =
    res = a div b        # цСлочислСнноС Π΄Π΅Π»Π΅Π½ΠΈΠ΅
    remainder = a mod b  # цСлочислСнноС взятиС остатка

  var
    x, y: int
  echo "Π΄ΠΎ:    x = ", x, "; y = ", y
  divmod(8, 5, x, y) # ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ x ΠΈ y
  echo "послС: x = ", x, "; y = ", y

nbText:"""
Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, `res` ΠΈ `remainder` ΡΠ²Π»ΡΡŽΡ‚ΡΡ `var ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ`. Π’Π°ΠΊΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚
ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ΠΎΠΉ ΠΈ измСнСния станут Π²ΠΈΠ΄ΠΈΠΌΡ‹ Π²Ρ‹Π·Π²Π°Π²ΡˆΠ΅ΠΌΡƒ."""

nbQuoteBlock:
  nbText: """
  ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅ вмСсто `var ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²` Π»ΡƒΡ‡ΡˆΠ΅ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΊΠΎΡ€Ρ‚Π΅ΠΆ
  (`tuple`)."""

nbSubSection "Команда `discard`"

nbText:"""
 Π’ Nim нСльзя просто ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Ρ‘Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π§Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ,
 Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΡƒΡŽ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΈ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π΅Ρ‘ Π²Ρ‹Π·ΠΎΠ²Π°, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ
 ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ `discard`:"""

nbCodeSkip:
  discard yes("МоТно ΠΌΠ½Π΅ Π·Π°Π΄Π°Ρ‚ΡŒ бСсполСзный вопрос?")

nbText:"""
Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Ρ‘Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ нСявно, Ссли вызываСмая ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ΠΈΠ»ΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€
Π±Ρ‹Π»ΠΈ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ с ΠΏΡ€Π°Π³ΠΌΠΎΠΉ `discardable`:"""

nbCode:
  proc p(x, y: int): int {.discardable.} =
    return x + y

  p(3, 4) # Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

nbSubSection "Π˜ΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹"

nbText:"""
Π‘Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρƒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Π² ΠΊΠ°ΠΊΠΎΠΌ порядкС ΠΎΠ½ΠΈ ΠΈΠ΄ΡƒΡ‚. Π­Ρ‚ΠΎ
особСнно Π²Π΅Ρ€Π½ΠΎ для ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡ‚ слоТныС Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…. Π’ Ρ‚Π°ΠΊΠΈΡ… случаях
Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Π»ΠΎ понятнСС, ΠΊΠ°ΠΊΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΊΠ°ΠΊΠΎΠΌΡƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ
соотвСтствуСт:"""

nbCodeSkip:
  proc createWindow(x, y, width, height: int; title: string;
                    show: bool): Window

  var w = createWindow(show = true, title = "My Application",
                       x = 0, y = 0, height = 600, width = 800)

nbText:"""
Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ использовали ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ для Π²Ρ‹Π·ΠΎΠ²Π° `createWindow`, порядок
Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² большС Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ значСния. МоТно ΡΠΌΠ΅ΡˆΠΈΠ²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ с
Π½Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ, Π½ΠΎ это ΡƒΡ…ΡƒΠ΄ΡˆΠ°Π΅Ρ‚ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒ:"""

nbCodeSkip:
  var w = createWindow(0, 0, title = "My Application",
                       height = 600, width = 800, true)

nbText:"""
ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ провСряСт, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄ΠΈΠ½ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚."""

nbSubSection "ЗначСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ"

nbText:"""
Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ `createWindow` стало ΠΏΡ€ΠΎΡ‰Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ
`значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ`, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ‚Π΅ значСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² качСствС
Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Ссли Π²Ρ‹Π·Π²Π°Π²ΡˆΠΈΠΉ ΠΈΡ… Π½Π΅ ΡƒΠΊΠ°Π·Π°Π»:"""

nbCodeSkip:
  proc createWindow(x = 0, y = 0, width = 500, height = 700,
                    title = "unknown",
                    show = true): Window =
    discard

  var w = createWindow(title = "My Application", height = 600, width = 800)

nbText:"""
Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ `createWindow` Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ лишь Ρ‚Π΅ значСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΎΡ‚
Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ для ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² со значСниями ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ Ρ‚ΠΈΠΏΠΎΠ², Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½Π΅Ρ‚
нСобходимости ΠΏΠΈΡΠ°Ρ‚ΡŒ `title: string = "unknown"`."""

nbSubSection "ΠŸΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹"

nbText:"""
Nim Π΄Π°Ρ‘Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΏΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ с C++:"""

nbCode:
  proc toString(x: int): string =
    result =
      if x < 0: "ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅"
      elif x > 0: "ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅"
      else: "ноль"

  proc toString(x: bool): string =
    if x: result = "true"
    else: result = "false"

  echo toString(13)    # вызываСтся ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° toString(x: int)
  echo toString(true)  # вызываСтся ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° toString(x: bool)

nbQuoteBlock:
  nbText:"""
ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: `toString` Π² Nim ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ рСализуСтся ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ `$`"""

nbText: """
ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Π²Ρ‹Π±Π΅Ρ€Π΅Ρ‚ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΡΡ‰ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ для Π²Ρ‹Π·ΠΎΠ²Π° `toString`. Как ΠΈΠΌΠ΅Π½Π½ΠΎ
Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π²Ρ‹Π±ΠΎΡ€Π° ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΡ‹Ρ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€, Ρ‚ΡƒΡ‚ ΠΎΠ±ΡΡƒΠΆΠ΄Π°Ρ‚ΡŒΡΡ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ (этот вопрос
Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π½ Π² руководствС). Однако ΠΎΠ½ Π½Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ нСприятным ΡΡŽΡ€ΠΏΡ€ΠΈΠ·Π°ΠΌ ΠΈ базируСтся Π½Π°
довольно простом Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ΅ ΡƒΠ½ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ. НСоднозначныС Π²Ρ‹Π·ΠΎΠ²Ρ‹ приводят ΠΊ Π²Ρ‹Π²ΠΎΠ΄Ρƒ сообщСния ΠΎΠ±
ошибкС."""

nbSubSection "ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹"

nbText:"""
Бтандартная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Nim интСнсивно ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ – ΠΎΠ΄Π½Π° ΠΈΠ· ΠΏΡ€ΠΈΡ‡ΠΈΠ½ этого Π² Ρ‚ΠΎΠΌ,
Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ `+` это просто пСрСгруТСнная ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°. ΠŸΠ°Ρ€ΡΠ΅Ρ€ позволяСт
ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π² инфиксной `a + b` ΠΈΠ»ΠΈ прСфиксной Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ `+a`. Π˜Π½Ρ„ΠΈΠΊΡΠ½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€
всСгда ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, Π° прСфиксный – всСгда ΠΎΠ΄ΠΈΠ½.

ΠŸΠΎΡΡ‚Ρ„ΠΈΠΊΡΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½Ρ‹, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΠΎΠ³ΡƒΡ‚ привСсти ΠΊ нСоднозначности: `a @ @ b`
ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ `(a) @ (@b)` ΠΈΠ»ΠΈ `(a@) @ (b)`? ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ постфиксных ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² Π² Nim Π½Π΅Ρ‚, это
Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ всСгда Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ `(a) @ (@b)`.

ΠšΡ€ΠΎΠΌΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… встроСнных ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ²-ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ `and`, `or` ΠΈ `not`,
ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ всСгда состоят ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… символов: `+ - * \ / < > = @ $ ~ & % ! ? ^ . |`

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ - Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹. Ничто Π½Π΅ ΠΏΠΎΠΌΠ΅ΡˆΠ°Π΅Ρ‚ Π²Π°ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ свой
собствСнный ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ `@!?+~`, Π½ΠΎ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡΡ‚Ρ€Π°Π΄Π°Ρ‚ΡŒ.

ΠŸΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° опрСдСляСтся ΠΏΠΎ Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ символу. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΡΡ‚ΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π²
руководствС.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€, Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π΅Π³ΠΎ Π² апострофы:"""

nbCodeSkip:
  proc `$` (x: myDataType): string = discard
  # Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ $ Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈ с myDataType, пСрСкрывая ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ $,
  # Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ΅ Ρ€Π°Π½Π΅Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для встроСнных Ρ‚ΠΈΠΏΠΎΠ²

nbText:"""
Π­Ρ‚Π° нотация Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для Π²Ρ‹Π·ΠΎΠ²Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹:"""

nbCode:
  if `==`( `+`(3, 4), 7): echo("Π˜ΡΡ‚ΠΈΠ½Π°")

nbSubSection "ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ объявлСния"

nbText:"""
КаТдая пСрСмСнная, ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ΠΈ Ρ‚.Π΄. Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ объявлСна, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π΅Ρ‘ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚
ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. (ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ слоТно ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ Π»ΡƒΡ‡ΡˆΠ΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ для языка,
ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΌΠ΅Ρ‚Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² Ρ‚ΠΎΠΉ ΠΆΠ΅ стСпСни, Π² ΠΊΠ°ΠΊΠΎΠΉ Π΅Π³ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Nim.)
Однако этого нСльзя ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²ΠΎ Π²Π·Π°ΠΈΠΌΠ½ΠΎ рСкурсивных ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°Ρ…:"""

nbCodeSkip:
  # ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ объявлСниС:
  proc even(n: int): bool

nbCodeSkip:
  proc odd(n: int): bool =
    assert(n >= 0) # Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ свалимся Π² ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ
    if n == 0: false
    else:
      n == 1 or even(n-1)

  proc even(n: int): bool =
    assert(n >= 0) # Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ свалимся Π² ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ
    if n == 1: false
    else:
      n == 0 or odd(n-1)

nbText:"""
Π—Π΄Π΅ΡΡŒ `odd` зависит ΠΎΡ‚ `even` ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, `even` Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΡ‚ΡŒΡΡ
компилятору Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°. Бинтаксис для Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ
объявлСния нСслоТСн: просто пропуститС `=` ΠΈ Ρ‚Π΅Π»ΠΎ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹. `assert` добавляСт Π³Ρ€Π°Π½ΠΈΡ‡Π½Ρ‹Π΅
условия ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ описан ΠΏΠΎΠ·Π΄Π½Π΅Π΅ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠœΠΎΠ΄ΡƒΠ»ΠΈ.

Π’ Π΄Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠΈΡ… вСрсиях языка трСбования для ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… объявлСний Π±ΡƒΠ΄ΡƒΡ‚ ΠΌΠ΅Π½Π΅Π΅ строгими.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ Ρ‚Π΅Π»ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ ΠΈΠ· СдинствСнного выраТСния, Ρ‡ΡŒΡ‘
Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ возвращаСтся нСявно."""

nbNewSection "Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹"

nbText:"""
Как ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Π² Π²Π²Π΅Π΄Π΅Π½ΠΈΠΈ, Nim Ρ€Π°Π·Π»ΠΈΡ‡Π°Π΅Ρ‚ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅
соотвСтствСнно ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌΠΈ словами `proc`, `func` ΠΈ `method`. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… аспСктах Nim
Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»Π΅Π΅ строг Π² своих опрСдСлСниях, Ρ‡Π΅ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ языки.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Π»ΠΈΠΆΠ΅ ΠΊ ΠΏΠΎΠ½ΡΡ‚ΠΈΡŽ чистой матСматичСской Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π½Π°ΠΊΠΎΠΌΡ‹ΠΌ, Ссли Π²Ρ‹
ΠΊΠΎΠ³Π΄Π°-Π»ΠΈΠ±ΠΎ занимались Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ. Π’ сущности ΠΎΠ½ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ
ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°ΠΌΠΈ с Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ограничСниями: ΠΎΠ½ΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΠΎΠΌΡƒ
ΡΠΎΡΡ‚ΠΎΡΠ½ΠΈΡŽ (Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ `const`) ΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Π΅ эффСкты.

ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово `func` Π² основном являСтся псСвдонимом для `proc`, ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ
{.noSideEffects.}. Но Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ всё ΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ свои измСняСмыС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅
ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ ΠΊΠ°ΠΊ `var`, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π»ΡŽΠ±Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ `ref`. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€, ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ
динамичСски. Π­Ρ‚ΠΎ Π·Π²ΡƒΡ‡ΠΈΡ‚ довольно слоТно, Π½ΠΎ этот ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚, тСсно связан с наслСдованиСм ΠΈ
ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ. Если Π²Ρ‹ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ (Π΄Π²Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹
с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ, Π½ΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ ΠΈΠ»ΠΈ Π½Π°Π±ΠΎΡ€Π°ΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ),
какя ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° Π±ΡƒΠ΄Π΅Ρ‚ использована опрСдСляСтся Π½Π° этапС компиляции. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹, с Π΄Ρ€ΡƒΠ³ΠΎΠΉ
стороны, зависят ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ΡΡ ΠΎΡ‚ `RootObj`. Π­Ρ‚ΠΎ Ρ‚Π΅ΠΌΠ°, которая
рассматриваСтся Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ части ΡƒΡ‡Π΅Π±Π½ΠΈΠΊΠ°.
"""

nbNewSection "Π˜Ρ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹"

nbText:"""
Π”Π°Π²Π°ΠΉΡ‚Π΅ вСрнёмся ΠΊ простому ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ с подсчётом:"""

nbCode:
  echo("Π‘Ρ‡ΠΈΡ‚Π°Π΅ΠΌ Π΄ΠΎ дСсяти: ")
  for i in countup(1, 10):
    echo($i)

nbText:"""
МоТно Π»ΠΈ самим Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ countup для использования Π² Ρ‚Π°ΠΊΠΎΠΌ Ρ†ΠΈΠΊΠ»Π΅? Π”Π°Π²Π°ΠΉΡ‚Π΅
ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ:"""

nbCodeSkip:
  proc countup(a, b: int): int =
    var res = a
    while res <= b:
      return res
      inc(res)

nbText:"""
Π£Π²Ρ‹, это Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π½Π΅ просто Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π°
Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ. Π’ΠΎΡ‚ это Β«Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒΒ»
называСтся ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ `yield`. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ лишь Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово `proc` Π½Π°
`iterator` ΠΈ Π²ΠΎΡ‚ ΠΎΠ½ – наш ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€:"""

nbCodeSkip:
  iterator countup(a, b: int): int =
    var res = a
    while res <= b:
      yield res
      inc(res)

nbText:"""
Π˜Ρ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠΈ Π½Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹, Π½ΠΎ ΠΈΠΌΠ΅ΡŽΡ‚ нСсколько Π²Π°ΠΆΠ½Ρ‹Ρ… Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠΉ:

  - ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· Ρ†ΠΈΠΊΠ»ΠΎΠ² `for`;
  - ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ `return`, Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ
    `yield`;
  - Ρƒ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² Π½Π΅Ρ‚ нСявной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ `result`;
  - ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ;
  - ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ компилятор Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ
    Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ inline ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ (это ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ±Ρ€Π°Π½ΠΎ Π² Π±ΡƒΠ΄ΡƒΡ‰ΠΈΡ… вСрсиях
    компилятора).

Однако, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ `closure`, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π½Π°Π±ΠΎΡ€ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ.
ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΡΡ‚ΠΈ смотритС Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Β«Π˜Ρ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ класса». Π˜Ρ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚
ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚Π΅ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π° ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, Ρ‡Ρ‚ΠΎ ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹: Ρƒ Π½ΠΈΡ… своё собствСнноС пространство ΠΈΠΌΡ‘Π½.
ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π΅ΡΡ‚ΡŒ общСпринятая ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° оборачивания ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² Π² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ с Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ,
ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΠΊΠ°ΠΏΠ»ΠΈΠ²Π°ΡŽΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Π΅Π³ΠΎ Π² Π²ΠΈΠ΄Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ΠΊΠ°ΠΊ
`split` ΠΈΠ· модуля `std/strutils`."""

nbNewSection "Π‘Π°Π·ΠΎΠ²Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹"

nbText:"""
Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Ρ€Π°Π·Π±ΠΈΡ€Π°ΡŽΡ‚ΡΡ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ встроСнныС Ρ‚ΠΈΠΏΡ‹ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ для Π½ΠΈΡ…
доступны."""

nbSubSection "ЛогичСскиС значСния `bool`"

nbText:"""
ЛогичСский Ρ‚ΠΈΠΏ Π² Nim называСтся bool ΠΈ состоит ΠΈΠ· Π΄Π²ΡƒΡ… ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ `true` ΠΈ
`false`. Условия Π² ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ… `while```,`` if, `elif` ΠΈ `when` Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΈΠΏ `bool`.

Для Ρ‚ΠΈΠΏΠ° `bool` ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ `not`, `and`, `or`, `xor`, `<`, `<=`, `>`, `>=`, `!=`
ΠΈ `==`. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ `and` ΠΈ `or` Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ сокращённыС вычислСния. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:"""

nbCodeSkip:
  while p != nil and p.name != "xyz":
    # p.name Π½Π΅ вычисляСтся, Ссли p == nil
    p = p.next

nbSubSection "Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ‹ `char`"

nbText:"""
Π‘ΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ Π² Nim называСтся `char`. Π•Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ€Π°Π²Π΅Π½ ΠΎΠ΄Π½ΠΎΠΌΡƒ Π±Π°ΠΉΡ‚Ρƒ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΠ½
Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ собой символ UTF-8, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΅Π³ΠΎ Ρ‡Π°ΡΡ‚ΡŒ. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° этого Π² эффСктивности:
Π² ΠΏΠΎΠ΄Π°Π²Π»ΡΡŽΡ‰Π΅ΠΌ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π²
UTF-8, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ UTF-8 Π±Ρ‹Π» Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ для этого. Π‘ΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ Π·Π°ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ
Π² ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹Π΅ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ.

Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² `==`, `<`, `<=`, `>` ΠΈ `>=`. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ `$`
ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ `char` Π² `string`. Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ‹ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΌΠ΅ΡˆΠΈΠ²Π°Ρ‚ΡŒΡΡ с Ρ†Π΅Π»Ρ‹ΠΌΠΈ числами; для
получСния числСнного значСния символа ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ `ord`. ΠšΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ·
числСнного значСния Π² символ выполняСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ `chr`."""

nbSubSection "Π‘Ρ‚Ρ€ΠΎΠΊΠΈ `string`"

nbText:"""
Π‘Ρ‚Ρ€ΠΎΠΊΠΎΠ²Ρ‹Π΅ значСния Π² Nim измСняСмыС, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ опСрация добавлСния подстроки ΠΊ строкС
довольно эффСктивна. Π‘Ρ‚Ρ€ΠΎΠΊΠΈ Π² Nim ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π½ΡƒΠ»Ρ‘ΠΌ ΠΈ содСрТат ΠΏΠΎΠ»Π΅ Π΄Π»ΠΈΠ½Ρ‹.
Π”Π»ΠΈΠ½Ρƒ строки ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ встроСнной ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ΠΎΠΉ `len`; Π΄Π»ΠΈΠ½Π° Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚
Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠΉ ноль. ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰Π΅ΠΌΡƒ Π½ΡƒΠ»ΡŽ - ошибка, ΠΎΠ½ сущСствуСт
Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Nim строки ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹Ρ‚ΡŒ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π² `cstring` Π±Π΅Π· создания ΠΊΠΎΠΏΠΈΠΈ.

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присвоСния для строк ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ строку. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ `&` для
ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΠΈ строк ΠΈ `add` для добавлСния ΠΊ строкС.

Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ строк производится Π² лСксикографичСском порядкС. Допустимы Π»ΡŽΠ±Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹
сравнСния. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, всС строки ΡΠ²Π»ΡΡŽΡ‚ΡΡ строками UTF-8, Π½ΠΎ это Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ.
НапримСр, ΠΏΡ€ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ строк ΠΈΠ· Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΎΠ½ΠΈ, скорСС, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой
ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π±Π°ΠΉΡ‚ΠΎΠ². ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ `s[i]` ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ i-ΠΉ `char` строки, Π° Π½Π΅ i-ΠΉ юникод
символ `unichar`.

Π‘Ρ‚Ρ€ΠΎΠΊΠΎΠ²Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ пустой строкой `""`."""

nbSubSection "Π¦Π΅Π»Ρ‹Π΅ числа `int`"

nbText:"""
Nim ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ встроСнныС цСлочислСнныС Ρ‚ΠΈΠΏΡ‹: `int`, `int8`, `int16`, `int32`,
`int64`, `uint`, `uint8`, `uint16`, `uint32` ΠΈ `uint64`.

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ цСлочислСнный Ρ‚ΠΈΠΏ `int`. ЦСлочислСнныС Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ
суффикс, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰ΠΈΠΉ ΠΈΡ… ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΌΡƒ цСлочислСнному Ρ‚ΠΈΠΏΡƒ:"""

nbCodeInBlock:
  let
    x = 0     # int
    y = 0'i8  # int8
    z = 0'i64 # int64
    u = 0'u   # uint

  echo "x ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ ", typeof(x)
  echo "y ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ ", typeof(y)
  echo "z ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ ", typeof(z)
  echo "u ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ ", typeof(u)

nbText:"""
Π§Π°Ρ‰Π΅ всСго Ρ†Π΅Π»Ρ‹Π΅ числа ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для подсчёта ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Ρ€Π°Π·ΠΌΠ΅Ρ‰Ρ‘Π½Π½Ρ‹Ρ… Π² памяти, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ
Ρ€Π°Π·ΠΌΠ΅Ρ€ `int` Ρ€Π°Π²Π΅Π½ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ указатСля."""

nbText:"""
ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ `+`, `-`, `*`, `div`, `mod`, `<`, `<=`, `==`, `!=`, `>` ΠΈ `>=`
ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ для Ρ†Π΅Π»Ρ‹Ρ… чисСл. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ `and`, `or`, `xor` ΠΈ `not` Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ для
Ρ†Π΅Π»Ρ‹Ρ… чисСл ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. Π‘ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ сдвиг Π²Π»Π΅Π²ΠΎ дСлаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ
ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° `shl`, Π° сдвиг Π²ΠΏΡ€Π°Π²ΠΎ – с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° `shr`. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ сдвига
всСгда Ρ‚Ρ€Π°ΠΊΡ‚ΡƒΡŽΡ‚ свой Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΊΠ°ΠΊ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ΅ число. Они ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для
умноТСния ΠΈΠ»ΠΈ дСлСния.

ВсС Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ цикличСский ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄, соотвСтствСнно, ΠΎΠ½ΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚
привСсти ΠΊ ошибкам пСрСполнСния.

АвтоматичСскоС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² выполняСтся Π² выраТСниях, Π³Π΄Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅
цСлочислСнныС Ρ‚ΠΈΠΏΡ‹. Однако, Ссли ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Π²Π΅Π΄Ρ‘Ρ‚ ΠΊ ΠΏΠΎΡ‚Π΅Ρ€Π΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ,
вызываСтся ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ RangeDefect (Ссли ошибка Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π° Π½Π° этапС
компиляции)."""

nbSubSection "Числа с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой `float`"

nbText:"""
Nim ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ встроСнныС Ρ‚ΠΈΠΏΡ‹ чисСл с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой: `float`, `float32` ΠΈ
`float64`.

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΈΠΏ `float`. Π’ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ `float` всСгда ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ 64
Π±ΠΈΡ‚Π°.

Π›ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ чисСл с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ суффикс, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰ΠΈΠΉ ΠΈΡ… ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΊ
Ρ‚ΠΎΠΌΡƒ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ чисСл с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой:"""

nbCodeInBlock:
  var
    x = 0.0      # float
    y = 0.0'f32  # float32
    z = 0.0'f64  # float64

  echo "x ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ ", typeof(x)
  echo "y ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ ", typeof(y)
  echo "z ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ ", typeof(z)

nbText:"""
ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ `+`, `-`, `*`, `/`, `<`, `<=`, `==`, `!=`, `>` ΠΈ `>=` ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ для
чисСл с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ стандарту IEEE-754.

АвтоматичСскоС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² Π² выраТСниях с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Π²ΠΈΠ΄Π°ΠΌΠΈ Ρ‚ΠΈΠΏΠΎΠ² с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ
запятой выполняСтся: мСньшиС Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² большиС. ЦСлочислСнныС Ρ‚ΠΈΠΏΡ‹ **Π½Π΅**
ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ автоматичСски Π² Ρ‚ΠΈΠΏΡ‹ с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚. Для Ρ‚Π°ΠΊΠΈΡ…
ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ `toInt` ΠΈ `toFloat`."""

nbSubSection "ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ²"

nbText:"""
ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ Π±Π°Π·ΠΎΠ²Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π² Nim выполняСтся ΠΏΡƒΡ‚Ρ‘ΠΌ использования Ρ‚ΠΈΠΏΠ° ΠΊΠ°ΠΊ
Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:"""

nbCodeInBlock:
  var
    x: int32 = 1.int32   #  Ρ‚ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·ΠΎΠ² int32(1)
    y: int8  = int8('a') # 'a' == 97'i8
    z: float = 2.5       # int(2.5) округляСтся Π΄ΠΎ 2
    sum: int = int(x) + int(y) + int(z)

  echo "x = ", x, "; y = ", y, "; z = ", z
  echo "int(x) + int(y) + int(z) = ", sum

nbNewSection "Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ прСдставлСниС Ρ‚ΠΈΠΏΠΎΠ²"

nbText:"""
Как ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Ρ€Π°Π½Π΅Π΅, встроСнный ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ прСобразования Π² строку `$` ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ любой
Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ Π² строку, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ вывСсти Π½Π° экран с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ echo. Однако
ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ $ Π½Π΅ смоТСт Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ со слоТными Ρ‚ΠΈΠΏΠ°ΠΌΠΈ ΠΈΠ»ΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ создали
ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΏΠΎΠΊΠ° Π²Ρ‹ Π½Π΅ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ Π΅Π³ΠΎ для Π½ΠΈΡ….

Иногда ΠΏΡ€ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΡƒΠ·Π½Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ слоТного Ρ‚ΠΈΠΏΠ°, Π½Π΅ прибСгая ΠΊ
написанию для Π½Π΅Π³ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° $. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ΠΎΠΉ
`repr`, которая Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Π»ΡŽΠ±Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ ΠΈ Π΄Π°ΠΆΠ΅ со слоТными цикличСскими Π³Ρ€Π°Ρ„Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ….
Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΄Π°ΠΆΠ΅ для Π±Π°Π·ΠΎΠ²Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π΅ΡΡ‚ΡŒ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ
`$` ΠΈ `repr`:"""

nbCodeInBlock:
  var
    myBool = true
    myCharacter = 'n'
    myString = "nim"
    myInteger = 42
    myFloat = 3.14

  echo "bool   ", $myBool, ":", repr(myBool)
  echo "char   ", $myCharacter, ":", repr(myCharacter)
  echo "string ", $myString, ":", repr(myString)
  echo "int    ", $myInteger, ":", repr(myInteger)
  echo "float  ", $myFloat, ":", repr(myFloat)

nbNewSection "Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹"

nbText:"""
НовыС Ρ‚ΠΈΠΏΡ‹ Π² Nim ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ `type`:"""

nbCodeSkip:
  type
    biggestInt = int64      # цСлочислСнный Ρ‚ΠΈΠΏ, самый большой ΠΈΠ· доступных
    biggestFloat = float64  # Ρ‚ΠΈΠΏ с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой, самый большой ΠΈΠ· доступных

nbText:"""
ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΡ ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±ΡŒΡΠ²Π»Π΅Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ `type` выраТСния."""

nbSubSection "ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈe `enum`"

nbText:"""
ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ, относящаяся ΠΊ Ρ‚ΠΈΠΏΡƒ пСрСчислСний, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ лишь ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ΅ мноТСство
Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Π­Ρ‚ΠΎ мноТСство состоит ΠΈΠ· упорядочСнных символов. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ символ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅
отобраТаСтся Π½Π° цСлочислСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ символ соотвСтствуСт числу 0, Π²Ρ‚ΠΎΡ€ΠΎΠΉ –
числу 1 ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:"""

nbCodeInBlock:
  type
    Direction = enum
      north, east, south, west

  var x = south
  echo typeof(x) # `x` ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ `Direction`
  echo $x        # a Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ `south`

nbText:"""
Для пСрСчислСний ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π»ΡŽΠ±Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ сравнСния.

Π’ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Π½ΠΈΠ΅ нСоднозначности символы пСрСчислСний ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹:
`Direction.south`.

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ `$` ΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ любоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ пСрСчислСния Π² Π΅Π³ΠΎ имя, Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° `ord`
– Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ цСлочислСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

Для Π»ΡƒΡ‡ΡˆΠ΅Π³ΠΎ взаимодСйствия с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ языками программирования, символам пСрСчислСний ΠΌΠΎΠ³ΡƒΡ‚
явно Π½Π°Π·Π½Π°Ρ‡Π°Ρ‚ΡŒΡΡ цСлочислСнныС значСния. Однако ΠΎΠ½ΠΈ Π² любом случаС Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ Π²
порядкС возрастания. Π‘ΠΈΠΌΠ²ΠΎΠ», ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π½Π΅ Π±Ρ‹Π»ΠΎ явно Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΎ числСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚
Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ символа плюс 1.

Π―Π²Π½ΠΎ ΠΏΡ€ΠΎΠ½ΡƒΠΌΠ΅Ρ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ пСрСчислСния ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ пропуски:"""

nbCodeSkip:
  type
    MyEnum = enum
      a = 2, b = 4, c = 89

nbSubSection "ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΠΌΡ‹Π΅ Ρ‚ΠΈΠΏΡ‹ `Ordinal`"

nbText:"""
ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΡ, цСлочислСнныС Ρ‚ΠΈΠΏΡ‹, `char`, `bool` (ΠΈ ΠΏΠΎΠ΄Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ‹) – всС ΠΎΠ½ΠΈ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ
пСрСчислимыми Ρ‚ΠΈΠΏΠ°ΠΌΠΈ. Для пСрСчислимых Ρ‚ΠΈΠΏΠΎΠ² Π΅ΡΡ‚ΡŒ нСсколько ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ:

|ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ |	ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ
|---------|--------------
|`ord(x)` |	Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ†Π΅Π»ΠΎΠ΅ число, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для прСдставлСния значСния x
|`inc(x)` |	ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ x Π½Π° 1
|`inc(x, n)` |	ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ x Π½Π° n; n – Ρ†Π΅Π»ΠΎΠ΅ число
|`dec(x)` | 	ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ x Π½Π° 1
|`dec(x, n)` | 	ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ x Π½Π° n; n – Ρ†Π΅Π»ΠΎΠ΅ число
|`succ(x)` |	Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π·Π° x элСмСнт
|`succ(x, n)` | 	Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ n-ΠΉ элСмСнт, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π·Π° x
|`pred(x)` |	Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²Π΅Π½Π½ΠΈΠΊΠ° x
|`pred(x, n)` |	Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ n-Π³ΠΎ ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²Π΅Π½Π½ΠΈΠΊΠ° x

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ `inc`, `dec`, `succ` ΠΈ `pred` ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒΡΡ с ошибкой, Π²Ρ‹Π·Π²Π°Π² ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅
`RangeDefect` ΠΈΠ»ΠΈ `OverflowDefect`. (Если, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΊΠΎΠ΄ скомпилирован со Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΌΠΈ
подходящими ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°ΠΌΠΈ.)"""

nbSubSection "Π”ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ‹ `range`"

nbText:"""
Π­Ρ‚ΠΎΡ‚ Ρ‚ΠΈΠΏ прСдставляСт собой Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ цСлочислСнного Ρ‚ΠΈΠΏΠ° ΠΈΠ»ΠΈ пСрСчислСния
(Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°). ΠŸΡ€ΠΈΠΌΠ΅Ρ€:"""

nbCodeSkip:
  type
    MySubrange = range[0..5]

nbText:"""
`MySubrange` это Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ `int`, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ значСния ΠΎΡ‚ 0 Π΄ΠΎ 5. НазначСниС Π»ΡŽΠ±Ρ‹Ρ…
Π΄Ρ€ΡƒΠ³ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ‚ΠΈΠΏΠ° `MySubrange` ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ ошибкС ΠΏΡ€ΠΈ компиляции ΠΈΠ»ΠΈ Π²ΠΎ врСмя
выполнСния. НазначСниС Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ· Π΅Π³ΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ² (ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚) Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ.

ΠœΠΎΠ΄ΡƒΠ»ΡŒ `system` ΠΈΠΌΠ΅Π΅Ρ‚ Π²Π°ΠΆΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ `Natural`, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΉ ΠΊΠ°ΠΊ `range[0..high(int)]` (`high` Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚
максимально допустимоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ). Π”Ρ€ΡƒΠ³ΠΈΠ΅ языки программирования, для Ρ€Π°Π±ΠΎΡ‚Ρ‹
с Π½Π°Ρ‚ΡƒΡ€Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ числами, ΠΏΡ€ΠΈΠ½ΡƒΠΆΠ΄Π°ΡŽΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²Ρ‹Π΅ Ρ†Π΅Π»Ρ‹Π΅ числа. Π­Ρ‚ΠΎ часто Π±Ρ‹Π²Π°Π΅Ρ‚ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ:
вас Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΡƒΡŽ Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΡƒ лишь ΠΏΠΎ Ρ‚ΠΎΠΉ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅, Ρ‡Ρ‚ΠΎ
числа Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ. Π’ΠΈΠΏ `Natural` языка Nim позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ этой
распространённой ошибки Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ."""

nbSubSection "ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²Π° `set`"

nbText:"""
Π’ΠΈΠΏ `set` ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΡƒΠ΅Ρ‚ матСматичСскоС понятиС мноТСства. Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ мноТСства ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ
Ρ‚ΠΎΠ»ΡŒΠΊΠΎ пСрСчислимым Ρ‚ΠΈΠΏΠΎΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ:

  - int8-int16
  - uint8/byte-uint16
  - char
  - enum
  - ΠΏΠΎΠ΄Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ‹ пСрСчислимых Ρ‚ΠΈΠΏΠΎΠ², Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ `range[-10..10]`

ΠΈΠ»ΠΈ эквивалСнтным. Когда Π²Ρ‹ создаётС мноТСство с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΎΠ² Ρ†Π΅Π»Ρ‹Ρ… чисСл со Π·Π½Π°ΠΊΠΎΠΌ,
Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ сСта опрСдСляСтся ΠΊΠ°ΠΊ находящийся Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΠΎΡ‚ 0 Π΄ΠΎ DefaultSetElements-1,
Π³Π΄Π΅ DefaultSetElements Π² настоящСС врСмя всСгда Ρ€Π°Π²Π½ΠΎ (2^8). Максимальная Π΄Π»ΠΈΠ½Π° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°
для Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° мноТСства - это `MaxSetElements`, которая Π² настоящСС врСмя всСгда Ρ€Π°Π²Π½Π°
(2^16). Π’ΠΈΠΏΡ‹ с большСй Π΄Π»ΠΈΠ½ΠΎΠΉ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ΡΡ Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΎΡ‚ 0 Π΄ΠΎ
`MaxSetElements`-1.

Π­Ρ‚ΠΎ связано с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ мноТСства Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ ΠΊΠ°ΠΊ Π²Ρ‹ΡΠΎΠΊΠΎΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π²Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ Π±ΠΈΡ‚ΠΎΠ².
ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ мноТСство с Π±ΠΎΠ»Π΅Π΅ ΠΊΡ€ΡƒΠΏΠ½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ошибкС:"""

nbCodeSkip:
  var s: set[int64] # Error: set is too large; ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ `std/sets` для пСрСчислимых Ρ‚ΠΈΠΏΠΎΠ²
                    # с большС Ρ‡Π΅ΠΌ 2^16 Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… элСмСнтов

nbQuoteBlock:
  nbText: """
  ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π² Nim Ρ‚Π°ΠΊΠΆΠ΅ Π΅ΡΡ‚ΡŒ Ρ…Π΅Ρˆ мноТСства - `std/sets`, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅Ρ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ."""

nbText:"""
ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²Π° ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ сконструированы с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ конструктора мноТСства: `{}` это пустоС
мноТСство. ΠŸΡƒΡΡ‚ΠΎΠ΅ мноТСство совмСстимо ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ с Π»ΡŽΠ±Ρ‹ΠΌ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ мноТСства.
ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ элСмСнтов (ΠΈ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ²
элСмСнтов):"""

nbCodeSkip:
  type
    CharSet = set[char]
  var
    x: CharSet
  x = {'a'..'z', '0'..'9'} # ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²ΠΎ, содСрТащСС Π±ΡƒΠΊΠ²Ρ‹ ΠΎΡ‚ 'a' Π΄ΠΎ 'z'
                           # ΠΈ Ρ†ΠΈΡ„Ρ€Ρ‹ ΠΎΡ‚ '0' Π΄ΠΎ '9'

nbText:"""
ΠœΠΎΠ΄ΡƒΠ»ΡŒ `std/setutils` прСдоставляСт ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ для создания мноТСства ΠΈΠ· ΠΈΡ‚Π΅Ρ€Π°Π±Π΅Π»ΡŒΠ½Ρ‹Ρ…
Ρ‚ΠΈΠΏΠΎΠ²:"""

nbCodeSkip:
  import std/setutils

  let uniqueChars = myString.toSet

nbText:"""
Для мноТСств ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ:

|ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ |	ОписаниС
|---------|---------
|A + B |	объСдинСниС Π΄Π²ΡƒΡ… мноТСств
|A * B |	пСрСсСчСниС Π΄Π²ΡƒΡ… мноТСств
|A - B |	Ρ€Π°Π·Π½ΠΎΡΡ‚ΡŒ Π΄Π²ΡƒΡ… мноТСств (A Π±Π΅Π· элСмСнтов B)
|A == B | равСнство мноТСств
|A <= B | ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ подмноТСства (A являСтся подмноТСством B ΠΈΠ»ΠΈ эквивалСнтно B)
|A < B | строгоС ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ подмноТСства (A являСтся подмноТСством B)
|e in A |	ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎ мноТСству (A содСрТит элСмСнт e)
|e notin A |	A Π½Π΅ содСрТит элСмСнт e
|contains(A, e) |	A содСрТит элСмСнт e
|card(A) | ΠΌΠΎΡ‰Π½ΠΎΡΡ‚ΡŒ A (количСство элСмСнтов Π² A)
|incl(A, elem) | Ρ‚ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ A = A + {elem}
|excl(A, elem) | Ρ‚ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ A = A - {elem}"""


nbSubSection "Поля Π±ΠΈΡ‚ΠΎΠ²"

nbText:"""
ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²Π° часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для Ρ„Π»Π°Π³ΠΎΠ² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹. Π­Ρ‚ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΠ΅ (ΠΈ типобСзопасноС)
Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, Ρ‡Π΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ цСлочислСнных констант, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°Π΄ΠΎ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ `or`.

ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΡ, мноТСства ΠΈ каст ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ вмСстС ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:"""

nbCodeSkip:
  type
    MyFlag* {.size: sizeof(cint).} = enum
      A
      B
      C
      D
    MyFlags = set[MyFlag]

  proc toNum(f: MyFlags): int = cast[cint](f)
  proc toFlags(v: int): MyFlags = cast[MyFlags](v)

  assert toNum({}) == 0
  assert toNum({A}) == 1
  assert toNum({D}) == 8
  assert toNum({A, C}) == 5
  assert toFlags(0) == {}
  assert toFlags(7) == {A, B, C}

nbText: """
Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅ ΠΊΠ°ΠΊ мноТСства ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ пСрСчислСния Π² стСпСни числа 2.

Когда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ пСрСчислСния ΠΈ мноТСства с C, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ cint (`distinct
cint`).

Для совмСстимогог ΠΊΠΎΠ΄Π° с C, смотри - [bitsize
pragma](https://nim-lang.org/docs/manual.html#implementation-specific-pragmas-bitsize-pragma)."""

nbSubSection "Массив `array`"

nbText:"""
Массив прСдставляСт собой простой ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ фиксированного Ρ€Π°Π·ΠΌΠ΅Ρ€Π°. ВсС Π΅Π³ΠΎ элСмСнты ΠΈΠΌΠ΅ΡŽΡ‚
ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ‚ΠΈΠΏ. Π’ качСствС индСкса массива ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ любой пСрСчислимый Ρ‚ΠΈΠΏ.

Массив ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ создан с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ []:"""

nbCodeInBlock:
  type
    IntArray = array[0..5, int] # массив Ρ†Π΅Π»Ρ‹Ρ… чисСл, индСксированный ΠΎΡ‚ 0 Π΄ΠΎ 5
  var
    x: IntArray
  x = [1, 2, 3, 4, 5, 6]
  for i in low(x)..high(x):
    echo x[i], " Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ", i

nbText:"""
Нотация `x[i]` ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для получСния доступа ΠΊ i-ΠΌΡƒ элСмСнту `x`. ΠŸΡ€ΠΈ доступС ΠΊ
элСмСнтам массива всСгда производится ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π³Ρ€Π°Π½ΠΈΡ† (Π»ΠΈΠ±ΠΎ Π²ΠΎ врСмя компиляции, Π»ΠΈΠ±ΠΎ Π²ΠΎ
врСмя выполнСния). Π­Ρ‚Ρƒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π³ΠΌΠ°ΠΌΠΈ ΠΈΠ»ΠΈ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ компилятора с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ
`--bound_checks:off`.

ΠœΠ°ΡΡΠΈΠ²Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ-значСниями, ΠΊΠ°ΠΊ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ Nim. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚
содСрТимоС массива Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ.

ВстроСнная ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° len Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΄Π»ΠΈΠ½Ρƒ массива. `low(a)` Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ наимСньший
Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΉ индСкс массива `a`, Π° `high(a)` – наибольший Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΉ индСкс."""

nbCode:
  type
    Direction = enum
      north, east, south, west
    BlinkLights = enum
      Off, On, slowBlink, mediumBlink, fastBlink
    LevelSetting = array[north..west, BlinkLights]
  var
    level: LevelSetting
  level[north] = On
  level[south] = slowBlink
  level[east] = fastBlink
  echo "repr(level) = ", repr(level)
  echo "low(level) = ", low(level)
  echo "len(level) = ", len(level)
  echo "high(level) = ", high(level)

nbText:"""
Бинтаксис для Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… массивов (мноТСствСнная Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ) Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… языках сводится ΠΊ
добавлСнию Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Ρ… скобок, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ
Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ‚ΠΈΠΏΠ°, Ρ‡Ρ‚ΠΎ ΠΈ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅. Π’ Nim Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ измСрСния с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ
индСксными Ρ‚ΠΈΠΏΠ°ΠΌΠΈ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ синтаксис влоТСнности нСсколько Π΄Ρ€ΡƒΠ³ΠΎΠΉ. ΠžΡΠ½ΠΎΠ²Ρ‹Π²Π°ΡΡΡŒ Π½Π°
ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, Π³Π΄Π΅ level ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ ΠΊΠ°ΠΊ массив пСрСчислСний, индСксированный Π΄Ρ€ΡƒΠ³ΠΈΠΌ
пСрСчислСниСм, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ строки, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Π°Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ‚ΠΈΠΏΡƒ маяка
Ρ€Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒΡΡ ΠΏΠΎ уровням, доступ ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· ΠΈΡ… цСлочислСнный индСкс:"""

nbCode:
  type
    LightTower = array[1..3, LevelSetting]
  var
    tower: LightTower
  tower[1][north] = slowBlink
  tower[1][east] = mediumBlink
  echo "len(tower)    = ", len(tower)
  echo "len(tower[1]) = ", len(tower[1])
  echo "repr(tower)   = ", repr(tower)
  # Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ строки Π½Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈΠ·-Π·Π° нСсовпадСния Ρ‚ΠΈΠΏΠΎΠ²
  #tower[north][east] = on
  #tower[0][1] = on

nbQuoteBlock:
  nbText:"""
  ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ встроСнная ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° len Π²Π΅Ρ€Π½Ρ‘Ρ‚ Π΄Π»ΠΈΠ½Ρƒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ массива ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ
  уровня. Π§Ρ‚ΠΎΠ±Ρ‹ Π΅Ρ‰Ρ‘ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡƒΡŽ ΠΏΡ€ΠΈΡ€ΠΎΠ΄Ρƒ LightTower, ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ
  ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° LevelSetting, Π° вмСсто этого Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π΅Π³ΠΎ нСпосрСдствСнно Π²
  Ρ‚ΠΈΠΏ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ измСрСния:"""

  nbCodeSkip:
    type
      LightTower = array[1..10, array[north..west, BlinkLights]]

nbText:"""
Π”ΠΎΠ²ΠΎΠ»ΡŒΠ½ΠΎ часто массивы Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с нуля, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ сокращённый синтаксис для задания
Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° ΠΎΡ‚ нуля Π΄ΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ индСкса минус ΠΎΠ΄ΠΈΠ½:"""

nbCodeInBlock:
  type
    IntArray = array[0..5, int] # массив, индСксированный ΠΎΡ‚ 0 Π΄ΠΎ 5
    QuickArray = array[6, int]  # массив, индСксированный ΠΎΡ‚ 0 Π΄ΠΎ 5
  var
    x: IntArray
    y: QuickArray
  x = [1, 2, 3, 4, 5, 6]
  y = x
  for i in low(x)..high(x):
    echo "i = ", i, "; ", "x[i] = ", x[i], "; y[i] = ", y[i]

nbSubSection "ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ `seq`"

nbText:"""
ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΠΎΡ…ΠΎΠΆΠΈ Π½Π° массивы, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΡ… Π΄Π»ΠΈΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Π² Ρ…ΠΎΠ΄Π΅ выполнСния
(ΠΊΠ°ΠΊ Ρƒ строк). ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€, ΠΎΠ½ΠΈ всСгда
Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ Π² ΠΊΡƒΡ‡Π΅ ΠΈ ΡƒΡ‡Π°ΡΡ‚Π²ΡƒΡŽΡ‚ Π² сборкС мусора.

ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ всСгда ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡ€ΡƒΡŽΡ‚ΡΡ `int`, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠΌΡΡ с 0. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ len, low ΠΈ high
ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ для ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ. Нотация `x[i]` ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для доступа ΠΊ i-ΠΌΡƒ
элСмСнту `x`.

ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ конструктора массива [], соСдинённого
с ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ прСобразования массива Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ @. Π”Ρ€ΡƒΠ³ΠΎΠΉ способ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ
для ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ состоит Π² Π²Ρ‹Π·ΠΎΠ²Π΅ встроСнной ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ newSeq.

ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ openarray.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:"""

nbCodeSkip:
  var
    x: seq[int] # ссылка Π½Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Ρ†Π΅Π»Ρ‹Ρ… чисСл
  x = @[1, 2, 3, 4, 5, 6] # @ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ массив Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Ρ€Π°Π·ΠΌΠ΅Ρ‰Ρ‘Π½Π½ΡƒΡŽ Π² ΠΊΡƒΡ‡Π΅

nbText:"""
ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅Ρ‚ `@[]`.

Команда for, использованная для ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ»ΠΈ двумя
ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ. Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Ρ„ΠΎΡ€ΠΌΡƒ с ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Ρ‚ΠΎ пСрСмСнная Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ
Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, прСдоставляСмоС ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ. Команда `for` ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ,
ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΌ ΠΈΠ· ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° `items()` модуля `std/system`.

Но Ссли Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Ρ„ΠΎΡ€ΠΌΡƒ с двумя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ, Ρ‚ΠΎΠ³Π΄Π° пСрвая пСрСмСнная содСрТит индСкс
ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ, Π° вторая – Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π’ этом случаС ΠΊΠΎΠΌΠ°Π½Π΄Π° for ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°
`pairs()` ΠΈΠ· модуля system. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:"""

nbCode:
  for i in @[3, 4, 5]:
    echo($i)

nbCode:
  for i, value in @[3, 4, 5]:
    echo "позиция: ", $i, ", Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:", $value

nbSubSection "ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ массивы `openarray`"

nbQuoteBlock:
  nbText: """
    ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ массивы ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²."""

nbText: """
Часто выясняСтся, Ρ‡Ρ‚ΠΎ массивы с фиксированным Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ нСдостаточно Π³ΠΈΠ±ΠΊΠΈ: ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°ΠΌ
Π±Ρ‹Π²Π°Π΅Ρ‚ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π΅Π»ΠΎ с массивами Ρ€Π°Π·Π½Ρ‹Ρ… Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ². Для этого Π΅ΡΡ‚ΡŒ Ρ‚ΠΈΠΏ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ массива.

ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ массивы всСгда ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ†Π΅Π»Ρ‹ΠΌΠΈ числами ΠΈ нумСрация начинаСтся с 0. Для Π½ΠΈΡ…
доступны ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ len, low ΠΈ high. Π›ΡŽΠ±ΠΎΠΉ массив с совмСстимым Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ
ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ массива, Ρ‚ΠΈΠΏ индСкса Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ значСния."""

nbCodeSkip:
  var
    fruits:   seq[string]       # ссылка Π½Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ строк, которая
                                # ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 'nil'
    capitals: array[3, string]  # массив строк с фиксированным Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ

  fruits = @[]                  # создаёт Π² ΠΊΡƒΡ‡Π΅ ΠΏΡƒΡΡ‚ΡƒΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Π½Π°
                                # ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π±ΡƒΠ΄Π΅Ρ‚ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ 'fruits'

  capitals = ["New York", "London", "Berlin"]   # массив 'capitals' позволяСт
                                                # ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ лишь Ρ‚Ρ€ΠΈ элСмСнта
  fruits.add("Banana")          # ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ 'fruits' динамичСски
                                # Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ΡΡ Π² Ρ…ΠΎΠ΄Π΅ выполнСния
  fruits.add("Mango")

  proc openArraySize(oa: openArray[string]): int =
    oa.len

  assert openArraySize(fruits) == 2     # ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ
                                        # Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°
  assert openArraySize(capitals) == 3   # Π½ΠΎ ΠΈ массив Ρ‚ΠΎΠΆΠ΅

nbText:"""
Π’ΠΈΠΏ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ массива Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌ: ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅Ρ€Π½Ρ‹Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ массивы Π½Π΅
ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½ΡƒΠΆΠ΄Π° Π² Π½ΠΈΡ… Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Ρ€Π΅Π΄ΠΊΠΎ ΠΈ ΠΈΡ… нСльзя Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ
эффСктивно."""

nbSubSection "ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ количСством Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² `varargs`"

nbText:"""
ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ `varargs` Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ массив. Однако, Π²Π΄ΠΎΠ±Π°Π²ΠΎΠΊ ΠΎΠ½ позволяСт ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π²
ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ любоС число Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ автоматичСски ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ список Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π²
массив:"""

nbCodeSkip:
  proc myWriteln(f: File, a: varargs[string]) =
    for s in items(a):
      write(f, s)
    write(f, "\n")

  myWriteln(stdout, "abc", "def", "xyz")
  # прСвращаСтся компилятором Π²:
  myWriteln(stdout, ["abc", "def", "xyz"])

nbText:"""
Π­Ρ‚ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ дСлаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ `varargs` послСдний Π²
Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹. Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² Π² этом контСкстС:"""

nbCodeSkip:
  proc myWriteln(f: File, a: varargs[string, `$`]) =
    for s in items(a):
      write(f, s)
    write(f, "\n")

  myWriteln(stdout, 123, "abc", 4.0)
  # прСвращаСтся компилятором Π²:
  myWriteln(stdout, [$123, $"abc", $4.0])

nbText:"""
Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ `$` примСняСтся ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρƒ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠΌΡƒ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ `a`.
Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ `$`, ΠΏΡ€ΠΈΠΌΠ΅Π½Ρ‘Π½Π½Ρ‹ΠΉ ΠΊ строкам, Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ."""

nbSubSection "Π‘Ρ€Π΅Π·Ρ‹ `Slice`"

nbText:"""
Π‘Ρ€Π΅Π·Ρ‹ выглядят ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° Ρ‚ΠΈΠΏΡ‹ ΠΏΠΎΠ΄Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ² ΠΏΠΎ синтаксису, Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ
контСкстС. Π‘Ρ€Π΅Π· β€” это просто ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° `Slice`, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит Π΄Π²Π΅ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹, `a` ΠΈ `b`.
Π‘Π°ΠΌ ΠΏΠΎ сСбС срСз Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π΅Π½, Π½ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅
ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ `Slice` для опрСдСлСния Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ².
"""

nbCodeInBlock:
  var
    a = "Nim is a programming language"
    b = "Slices are useless."

  echo a[7 .. 12] # --> 'a prog'
  b[11 .. ^2] = "useful"
  echo b # --> 'Slices are useful.'

nbText:"""
Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ срСзы ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для измСнСния части строки. Π“Ρ€Π°Π½ΠΈΡ†Ρ‹ срСза ΠΌΠΎΠ³ΡƒΡ‚
ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ значСния, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ ΠΈΡ… Ρ‚ΠΈΠΏΠΎΠΌ, Π½ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π°Ρ
ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ срСза, опрСдСляСт, ΠΊΠ°ΠΊΠΈΠ΅ значСния допустимы.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ способы указания индСксов строк, массивов, ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ ΠΈ Ρ‚.
Π΄., Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² Nim ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ индСксация с нуля.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, строка `b` ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π»ΠΈΠ½Ρƒ 19, ΠΈ Π΄Π²Π° Ρ€Π°Π·Π½Ρ‹Ρ… способа указания индСксов выглядят
Ρ‚Π°ΠΊ:

"Slices are useless."
 |          |     |
 0         11    17   использованиС индСксов
^19        ^8    ^2   использованиС синтаксиса с `^`

Π³Π΄Π΅ `b[0 .. ^1]` эквивалСнтно `b[0 .. b.len-1]` ΠΈ `b[0 ..< b.len]`, ΠΈ Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ `^1`
прСдоставляСт сокращённый способ указания `b.len-1`. Π‘ΠΌ. ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ индСкса.

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎ строка заканчиваСтся Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ, Ссли ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ
Ρ‡Π°ΡΡ‚ΡŒ строки "useless" ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΅Ρ‘ Π½Π° "useful":

`b[11 .. ^2]` β€” Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ "useless", Π° `b[11 .. ^2] = "useful"` замСняСт "useless" Π½Π°
"useful", давая Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ "Slices are useful."."""

nbQuoteBlock:
  nbText: """
ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ 1: Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ способы записи: `b[^8 .. ^2] = "useful"` ΠΈΠ»ΠΈ `b[11 ..
b.len-2] = "useful"`, ΠΈΠ»ΠΈ `b[11 ..< b.len-1] = "useful"`."""

nbQuoteBlock:
  nbText: """
ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ 2: ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ шаблон `^` Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ `int` Ρ‚ΠΈΠΏΠ° `BackwardsIndex`, ΠΌΡ‹
ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ константу `lastIndex` ΠΊΠ°ΠΊ `const lastIndex = ^1` ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Ρ‘
ΠΊΠ°ΠΊ `b[0 .. lastIndex]`."""

nbSubSection "ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ `object`"

nbText:"""
Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ для объСдинСния Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² Π΅Π΄ΠΈΠ½ΡƒΡŽ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡƒΡŽ структуру
являСтся Ρ‚ΠΈΠΏ `object`. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ β€” это Ρ‚ΠΈΠΏ-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚: ΠΏΡ€ΠΈ присваивании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°
Π½ΠΎΠ²ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ всС Π΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° `Foo` ΠΈΠΌΠ΅Π΅Ρ‚ конструктор `Foo(ΠΏΠΎΠ»Π΅: Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ...)`, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ
ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС Π΅Π³ΠΎ поля. НСуказанныС поля ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.
"""

nbCodeInBlock:
  type
    Person = object
      name: string
      age: int

  var person1 = Person(name: "Peter", age: 30)

  echo person1.name # "Peter"
  echo person1.age  # 30

  var person2 = person1 # копия person1

  person2.age += 14

  echo person1.age # 30
  echo person2.age # 44


  # порядок ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ΅Π½ΡΡ‚ΡŒ
  let person3 = Person(age: 12, name: "Quentin")
  doAssert person3.age == 12

  # Π½Π΅ всС поля ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹
  let person4 = Person(age: 3)
  # Π½Π΅ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ поля ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ значСниями ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.
  # Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС это пустая строка.
  doAssert person4.name == ""

nbText:"""
Поля ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π²ΠΈΠ΄Π½Ρ‹ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ модуля, Π³Π΄Π΅ ΠΎΠ½ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹,
Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠΌΠ΅Ρ‡Π°Ρ‚ΡŒ символом `*`.
"""

nbCodeSkip:
  type
    Person* = object # Ρ‚ΠΈΠΏ Π²ΠΈΠ΄Π΅Π½ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ
      name*: string  # ΠΏΠΎΠ»Π΅ этого Ρ‚ΠΈΠΏΠ° Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ
      age*: int

nbSubSection "ΠšΠΎΡ€Ρ‚Π΅ΠΆΠΈ `tuple`"

nbText:"""
ΠšΠΎΡ€Ρ‚Π΅ΠΆΠΈ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ ΠΏΠΎΡ…ΠΎΠΆΠΈ Π½Π° ΡƒΠΆΠ΅ Π·Π½Π°ΠΊΠΎΠΌΡ‹Π΅ Π²Π°ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. Они ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ-значСниями, ΠΈ
ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΏΠΎΠ»Π΅. Однако, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Ρ‚ΠΈΠΏΠΎΠ²-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Ρ‚ΠΈΠΏΡ‹
ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ ΡΠ²Π»ΡΡŽΡ‚ΡΡ **структурными** β€” это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ
эквивалСнтными, Ссли ΠΎΠ½ΠΈ содСрТат поля ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΈ Π² Ρ‚ΠΎΠΌ ΠΆΠ΅
порядкС.

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ `()` ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для создания ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ. ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ ΠΏΠΎΠ»Π΅ΠΉ Π² конструкторС Π΄ΠΎΠ»ΠΆΠ΅Π½
ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ порядку Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ°. Но, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², здСсь нСльзя
ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ имя Ρ‚ΠΈΠΏΠ° ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ°.

Как ΠΈ Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², доступ ΠΊ полям ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ° осущСствляСтся Ρ‡Π΅Ρ€Π΅Π· запись `t.ΠΏΠΎΠ»Π΅`. Однако Ρƒ
ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ Π΅ΡΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ β€” ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΏΠΎ индСксу: `t[i]`, Π³Π΄Π΅ `i` Π΄ΠΎΠ»ΠΆΠ½ΠΎ
Π±Ρ‹Ρ‚ΡŒ цСлочислСнной константой.
"""

nbCodeInBlock:
  type
    # Π’ΠΈΠΏ, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°:
    # состоит ΠΈΠ· ΠΈΠΌΠ΅Π½ΠΈ (name) ΠΈ возраста (age).
    Person = tuple
      name: string
      age: int

    # ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ синтаксис для эквивалСнтного Ρ‚ΠΈΠΏΠ°.
    PersonX = tuple[name: string, age: int]

    # Бинтаксис с Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΌΠΈ полями
    PersonY = (string, int)

  var
    person: Person
    personX: PersonX
    personY: PersonY

  person = (name: "Peter", age: 30)
  # Person ΠΈ PersonX эквивалСнтны
  personX = person

  # Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ° с Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΌΠΈ полями:
  personY = ("Peter", 30)

  # ΠšΠΎΡ€Ρ‚Π΅ΠΆ с Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΌΠΈ полями совмСстим с ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΌ,
  # Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΅ΡΡ‚ΡŒ ΠΈΠΌΠ΅Π½Π° ΠΏΠΎΠ»Π΅ΠΉ.
  person = personY
  personY = person

  # Часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ сокращённый синтаксис ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ
  person = ("Peter", 30)

  echo person.name  # "Peter"
  echo person.age   # 30

  echo person[0]    # "Peter"
  echo person[1]    # 30

  # ΠšΠΎΡ€Ρ‚Π΅ΠΆΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±Π΅Π· объявлСния ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°.
  var building: tuple[street: string, number: int]
  building = ("Rue del Percebe", 13)
  echo building.street

  # Π­Ρ‚Π° строка Π½Π΅ скомпилируСтся β€” ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ²!
  # person = building
  # --> Error: type mismatch: got (tuple[street: string, number: int])
  #     but expected 'Person'

nbText:"""
Π₯отя ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ Ρ‚ΠΈΠΏ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ° Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΏΠΎΠ»Π΅ΠΉ ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ
Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ, Π΄Π°ΠΆΠ΅ Ссли Ρ‚ΠΈΠΏΡ‹ ΠΏΠΎΠ»Π΅ΠΉ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚.

### Распаковка ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ
ΠŸΡ€ΠΈ присваивании ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ ΠΌΠΎΠΆΠ½ΠΎ **Ρ€Π°ΡΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ** β€” это ΡƒΠ΄ΠΎΠ±Π½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ сразу ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ поля
ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ. НапримСр, ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° `splitFile` ΠΈΠ· модуля `os` Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚
ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, имя ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° Π² Π²ΠΈΠ΄Π΅ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ°.

Для распаковки ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ скобки, ΠΈΠ½Π°Ρ‡Π΅ всС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ ΠΎΠ΄Π½ΠΎ ΠΈ
Ρ‚ΠΎ ΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (вСсь ΠΊΠΎΡ€Ρ‚Π΅ΠΆ)! НапримСр:
"""

nbCode:
  import std/os

  let
    path = "usr/local/nimc.html"
    (dir, name, ext) = splitFile(path)  # βœ… ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π°Ρ распаковка
    baddir, badname, badext = splitFile(path)  # ❌ ΠΠ΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ!

  echo dir      # Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ "usr/local"
  echo name     # Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ "nimc"
  echo ext      # Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ ".html"

  # ВсС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ содСрТат ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΊΠΎΡ€Ρ‚Π΅ΠΆ:
  echo baddir   # (dir: "usr/local", name: "nimc", ext: ".html")
  echo badname  # (Ρ‚ΠΎ ΠΆΠ΅ самоС)
  echo badext   # (Ρ‚ΠΎ ΠΆΠ΅ самоС)

nbText:"""
Распаковка ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² Ρ†ΠΈΠΊΠ»Π°Ρ… `for`:
"""

nbCodeInBlock:
  let points = [(10, 'a'), (20, 'b'), (30, 'c')]

  for (x, c) in points:
    echo x
  # Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚: 10; 20; 30

  # МоТно Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ индСкс:
  for i, (x, c) in points:
    echo i, c
  # Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚: 0a; 1b; 2c

nbText:"""
Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², поля ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ всСгда ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ β€” ΠΈΡ… Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ явно ΠΏΠΎΠΌΠ΅Ρ‡Π°Ρ‚ΡŒ для
экспорта.
"""

nbSubSection "БсылочныС ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ `ref` ΠΈ `ptr`"

nbText:"""
Бсылки (Ρ‚ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… языках программирования) это способ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ
ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ Β«ΠΌΠ½ΠΎΠ³ΠΈΠ΅-ΠΊ-ΠΎΠ΄Π½ΠΎΠΌΡƒΒ». Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·Π½Ρ‹Π΅ ссылки ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅
мСсто Π² памяти ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ.

Nim Ρ€Π°Π·Π»ΠΈΡ‡Π°Π΅Ρ‚ отслСТиваСмыС (traced) ΠΈ нСотслСТиваСмыС (untraced) ссылки. НСотслСТиваСмыС
ссылки Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ указатСлями. ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ ссылки ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² ΠΊΡƒΡ‡Π΅ со
сборкой мусора, нСотслСТиваСмыС – Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΠΎΠ΄ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»Π° Π²Ρ‹Π΄Π΅Π»Π΅Π½Π° Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΈΠ»ΠΈ
Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… мСстах памяти. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, нСотслСТиваСмыС ссылки нСбСзопасны.
Однако для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ (доступа ΠΊ Β«ΠΆΠ΅Π»Π΅Π·ΡƒΒ») ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ Π±Π΅Π· Π½ΠΈΡ… нСльзя.

ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ ссылки ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом `ref`, нСотслСТиваСмыС – ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом
`ptr`.

ΠŸΡƒΡΡ‚Π°Ρ subscript-нотация `[]` ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для разымСнования ссылки, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ для
получСния элСмСнта, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ссылка. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ `.` (доступ ΠΊ полю
ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ°/ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°) ΠΈ `[]` (ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ индСксирования массива/строки/ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ)
Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ нСявноС Ρ€Π°Π·Ρ‹ΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ для ссылочных Ρ‚ΠΈΠΏΠΎΠ²:"""

nbCodeSkip:
  type
    Node = ref NodeObj
    NodeObj = object
      le, ri: Node
      data: int
  var
    n: Node
  new(n)
  n.data = 9
  # Π½Π΅ Π½Π°Π΄ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ n[].data, это сильно сбиваСт с Ρ‚ΠΎΠ»ΠΊΡƒ!

nbText:"""
Для выдСлСния памяти ΠΏΠΎΠ΄ Π½ΠΎΠ²Ρ‹ΠΉ отслСТиваСмый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ встроСнная ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°
`new`:"""

nbCodeSkip:
  var n: Node
  new(n)

nbText:"""
Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с нСотслСТиваСмой ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ `alloc`, `dealloc` ΠΈ
`realloc`. ДокумСнтация модуля `std/system` содСрТит Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΏΠΎ этим
вопросам.

Если ссылка Π½ΠΈ Π½Π° Ρ‡Ρ‚ΠΎ Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΎΠ½Π° ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ `nil`."""

nbSubSection "ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ `proc`"

nbText:"""
ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ это (нСсколько абстрактный) ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅
ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ nil. Nim ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ для
Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚Π΅Ρ…Π½ΠΈΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:"""

nbCode:
  proc greet(name: string): string =
    "ΠŸΡ€ΠΈΠ²Π΅Ρ‚, " & name & "!"

  proc bye(name: string): string =
    "Пока, " & name & "."

  proc communicate(greeting: proc (x: string): string, name: string) =
    echo greeting(name)

  communicate(greet, "Π”ΠΆΠΎΠ½")
  communicate(bye, "ΠœΡΡ€ΠΈ")

nbText:"""
НСочСвидная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ„ΠΎΡ€ΠΌΠ° Π²Ρ‹Π·ΠΎΠ²Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹
влияСт Π½Π° ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ Ρ‚ΠΈΠΏΠΎΠ²: ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ совмСстимы Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚
ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΡ‹ Π²Ρ‹Π·ΠΎΠ²Π°. Π Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΡ‹ Π²Ρ‹Π·ΠΎΠ²Π° пСрСчислСны Π²
[руководствС](https://nim-lang.org/docs/manual.html#types-procedural-type)."""

nbSubSection "ΠžΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ `distinct`"

nbText: """
ΠžΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ позволяСт ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ ΠΏΠΎΠ΄Ρ‚ΠΈΠΏΠΎΠ²ΠΎΠ³ΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ
ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌ ΠΈ Π΅Π³ΠΎ Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ. Π’Π°ΠΌ **явно** Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ всС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ для
ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. Для ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π² этом, ΠΊΠ°ΠΊ ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ, Ρ‚Π°ΠΊ ΠΈ Π΅Π³ΠΎ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ ΠΌΠΎΠ³ΡƒΡ‚
ΠΏΠ΅Ρ€Π΅Π½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ‚ΠΈΠΏ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Π° (type casting).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ прСдоставлСны Π²
[руководствС](https://nim-lang.org/docs/manual.html#types-distinct-type)."""

nbNewSection "ΠœΠΎΠ΄ΡƒΠ»ΠΈ"

nbText:"""
Nim ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ€Π°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° части согласно ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚Ρƒ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ
находится Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅. ΠœΠΎΠ΄ΡƒΠ»ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ сокрытиС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΈ Ρ€Π°Π·Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ
ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ. Они ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ доступ ΠΊ символам Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
`import`. Π­ΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π±ΡƒΠ΄ΡƒΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ символы Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня, ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½Π½Ρ‹Π΅ Π·Π²Ρ‘Π·Π΄ΠΎΡ‡ΠΊΠΎΠΉ
(`*`):"""

nbCodeSkip:
  # ΠœΠΎΠ΄ΡƒΠ»ΡŒ A
  var
    x*, y: int

  proc `*` *(a, b: seq[int]): seq[int] =
    # ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ:
    newSeq(result, len(a))
    # ΠΏΠ΅Ρ€Π΅ΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ Π΄Π²Π΅ цСлочислСнных ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ:
    for i in 0..len(a)-1: result[i] = a[i] * b[i]

  when isMainModule:
    # ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ``*`` для ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ:
    assert(@[1, 2, 3] * @[1, 2, 3] == @[1, 4, 9])

nbText:"""
ΠœΠΎΠ΄ΡƒΠ»ΡŒ A экспортируСт `x` ΠΈ `*`, Π½ΠΎ Π½Π΅ `y`.

ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ ΠΈΡΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ стартС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚
ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ слоТных структур Π΄Π°Π½Π½Ρ‹Ρ….

Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅ Π΅ΡΡ‚ΡŒ особая магичСская константа `isMainModule`, которая истинна, Ссли
ΠΌΠΎΠ΄ΡƒΠ»ΡŒ скомпилирован Π² качСствС основного Ρ„Π°ΠΉΠ»Π°. Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ для внСдрСния Π²Π½ΡƒΡ‚Ρ€ΡŒ
модуля тСстов, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅.

Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ‹ модуля ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ синтаксиса `module.symbol`. Если
символ Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π΅Π½, ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ. Π‘ΠΈΠΌΠ²ΠΎΠ» являСтся Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½Ρ‹ΠΌ, Ссли ΠΎΠ½
ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ Π² Π΄Π²ΡƒΡ… (ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅) Ρ€Π°Π·Π½Ρ‹Ρ… модулях ΠΈ ΠΎΠ±Π° модуля ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ‚Ρ€Π΅Ρ‚ΡŒΠΈΠΌ:"""

nbCodeSkip:
  # ΠœΠΎΠ΄ΡƒΠ»ΡŒ A
  var x*: string

nbCodeSkip:
  # ΠœΠΎΠ΄ΡƒΠ»ΡŒ B
  var x*: int

nbCodeSkip:
  # ΠœΠΎΠ΄ΡƒΠ»ΡŒ C
  import A, B
  write(stdout, x) # ошибка: x Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π΅Π½
  write(stdout, A.x) # ошибки Π½Π΅Ρ‚: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€

  var x = 4
  write(stdout, x) # нСоднозначности Π½Π΅Ρ‚: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ x модуля C

nbText:"""
Но это ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Π½Π΅ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ ΠΊ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°ΠΌ ΠΈΠ»ΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌ. Π—Π΄Π΅ΡΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΏΡ€Π°Π²ΠΈΠ»Π°
ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠΈ:"""

nbCodeSkip:
  # ΠœΠΎΠ΄ΡƒΠ»ΡŒ A
  proc x*(a: int): string = $a

nbCodeSkip:
  # ΠœΠΎΠ΄ΡƒΠ»ΡŒ B
  proc x*(a: string): string = $a

nbCodeSkip:
  # ΠœΠΎΠ΄ΡƒΠ»ΡŒ C
  import A, B
  write(stdout, x(3))   # ошибки Π½Π΅Ρ‚: вызываСтся A.x
  write(stdout, x(""))  # ошибки Π½Π΅Ρ‚: вызываСтся B.x

  proc x*(a: int): string = nil
  write(stdout, x(3))   # Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ: ΠΊΠ°ΠΊΠΎΠΉ `x` Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ?

nbSubSection "Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ символов `except`"

nbText:"""
ΠžΠ±Ρ‹Ρ‡Π½ΠΎ, ΠΊΠΎΠΌΠ°Π½Π΄Π° `import` Π·Π°Π±ΠΈΡ€Π°Π΅Ρ‚ всС экспортируСмыС символы. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ, ΡƒΠΊΠ°Π·Π°Π²
ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹Π΅ символы с ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ `except`."""

nbCodeSkip:
  import mymodule except y

nbSubSection "Команда `from`"

nbText:"""
ΠœΡ‹ ΡƒΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ `import`, ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ всС экспортированныС символы.
Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ `from import` - Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ пСрСчислСнныС символы:"""

nbCodeSkip:
  from mymodule import x, y, z

nbText:"""
Команда `from` Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ пространства ΠΈΠΌΡ‘Π½ для символов, Π²
Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ, символы Π±ΡƒΠ΄ΡƒΡ‚ доступны, Π½ΠΎ для ΠΈΡ… использования потрСбуСтся ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ
ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€."""

nbCodeSkip:
  from mymodule import x, y, z

  x()           # использyeΠΌ x Π±Π΅Π· ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ

nbCodeSkip:
  from mymodule import nil

  mymodule.x()  # Π½ΡƒΠΆΠ½ΠΎ ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ x, ΡƒΠΊΠ°Π·Π°Π² имя модуля Π² качСствС прСфикса

  x()           # Ошибка: использованиС x Π±Π΅Π· ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ ошибкС компиляции

nbText:"""
ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΠΌΠ΅Π½Π° ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ довольно Π΄Π»ΠΈΠ½Π½Ρ‹Π΅, Π²Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅
псСвдонимы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ."""

nbCodeSkip:
  from mymodule as m import nil

  m.x()         # m это псСвдоним для mymodule

nbSubSection "Команда `include`"

nbText:"""
Команда `include` Π΄Π΅Π»Π°Π΅Ρ‚ Π½Π΅Ρ‡Ρ‚ΠΎ, Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‰Π΅Π΅ΡΡ ΠΎΡ‚ импортирования модуля: ΠΎΠ½Π°
вставляСт Π½Π° своё мСсто содСрТимоС Ρ„Π°ΠΉΠ»Π°. Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° вСсьма ΠΏΠΎΠ»Π΅Π·Π½Π° для разбиСния
большого модуля Π½Π° нСсколько Ρ„Π°ΠΉΠ»ΠΎΠ²:"""

nbCodeSkip:
  include fileA, fileB, fileC

nbSave # ----------------------------- END ------------------------------------