Перейти к основному содержимому

Простые приложения на Nim

Разработчику Архитектору

Когда читать: после первой программы и главы типы данных. Здесь те же идеи (proc, seq, Table, result) в коротких утилитах, которые можно собрать одной командой.

Nim компилируется в C/C++/JS: синтаксис похож на Python, производительность — как у нативного кода. Для учебных скриптов достаточно стандартной библиотеки (std/...); веб-фреймворки (Jester, Prologue) — следующий шаг после stdlib.


Как запускать примеры из главы

  1. Команда: nim c -r имя.nim — компиляция и сразу запуск (аналог python script.py).
  2. Только проверка: nim check имя.nim — быстрая диагностика без полной линковки.
  3. Версия: nim --version — убедитесь, что установлен Nim 2.x (ORC по умолчанию).

Связанные материалы:


Генератор паролей

Утилита показывает три приёма Nim: модуль random, изменяемая строка result в proc и литерал const для алфавита.


Как запустить

  • Файл: password.nim
  • Команда: nim c -r password.nim

import std/random, strutils

proc generatePassword(length = 16): string =
const chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
result = newString(length)
for i in 0 ..< length:
result[i] = chars[rand(chars.len)]

randomize()
echo generatePassword()
echo generatePassword(24)

Разбор:

  • length = 16 — параметр по умолчанию (см. функции).
  • result — встроенная переменная возврата; можно писать return, но для накопления строки result читается короче.
  • 0 ..< length — полуоткрытый диапазон (верхняя граница не входит), как в управляющих конструкциях.
  • randomize() — инициализация генератора; без неё последовательность при каждом запуске будет одинаковой.

Для CLI с аргументами добавьте import std/os и parseInt(paramStr(1)) — паттерн тот же, что в первой программе с readLine.


Сортировщик файла

Чтение текстового файла, нормализация строк и запись отсортированного списка — типичная задача для Nim без сторонних библиотек.


import std/[strutils, algorithm, os, sequtils]

proc sortFile(input, output: string) =
let lines = readFile(input).splitLines().map(strip).filterIt(it.len > 0)
writeFile(output, lines.sorted().join("\n") & "\n")

when isMainModule:
if paramCount() < 2:
echo "Использование: ", getAppFilename(), " input.txt output.txt"
quit(1)
sortFile(paramStr(1), paramStr(2))
echo "Готово: ", paramStr(2)

Разбор:

  • readFile / writeFile — весь файл в память; для гигабайтных логов нужна построчная обработка (File, readLine).
  • filterIt(it.len > 0) — убирает пустые строки после strip.
  • sorted() из algorithm — сортировка по умолчанию лексикографически; для чисел сначала map(parseInt).
  • when isMainModule — код запуска только при прямом вызове файла, а не при import модуля.

Общая идея работы с файлами на уровне ОС пересекается с материалами про исполняемые файлы и архивы — там про форматы, здесь про поток строк.


JSON-трекер задач

std/json парсит текст в дерево JsonNode; ниже — переход к типизированным объектам Nim.

Код ITЗагрузка примера кода…

Разбор:

  • %*{...} — макрос для литерала JSON-объекта.
  • getInt / getStr — доступ к полям; при отсутствии ключа будет исключение (см. ошибки и исключения).
  • seq[Task] — динамический список структур; операции со списком — в типах данных.

Для API без исключений в библиотечном коде можно вернуть Result[seq[Task], string] из std/results — см. основы — обработка ошибок.


HTTP (httpclient)

Минимальный HTTP GET через std/httpclient. Перед продакшеном стоит прочитать HTTP как основа веб-интеграций — статусы, заголовки, таймауты.

Код ITЗагрузка примера кода…

Разбор:

  • defer: client.close() — освобождение сокета при выходе из proc (в том числе при исключении).
  • timeout в миллисекундах — защита от "зависшего" сервера.
  • Срез body[0 ..< maxLen] — подстрока без копирования всего ответа в лог.

Для POST и заголовков используйте HttpClient.request с headers и body; для HTTPS достаточно URL с https:// при сборке с OpenSSL в toolchain.


Характерный пример — подсчёт слов и Table

Идиома initCountTable и неявный result часто встречаются в утилитах и парсерах.

Код ITЗагрузка примера кода…

Разбор:

  • Table — словарь "слово → количество"; операции таблицы — в типах данных.
  • inc — увеличить счётчик (создаёт ключ с нулём, если его не было).
  • pairs — итерация по ключам и значениям для вывода.

Тот же алгоритм на Python для сравнения — в простых приложениях на Python.


Что попробовать дальше

  1. Объединить JSON-трекер и HTTP — загрузка списка задач с URL (осторожно с доверенными источниками).
  2. Добавить nimble init и вынести sortFile / wordCount в модуль src/utils.nim.
  3. Прочитать архитектуру компиляции — почему nim c создаёт каталог nimcache с C-кодом.

См. также: Python — простые приложения (близкий синтаксис) · Nim — о разделе


Основа по протоколу

Базовый разбор HTTP и HTTPS находится в отдельной статье — HTTP как основа веб-интеграций.