Простые приложения на Nim
Когда читать: после первой программы и главы типы данных. Здесь те же идеи (proc, seq, Table, result) в коротких утилитах, которые можно собрать одной командой.
Nim компилируется в C/C++/JS: синтаксис похож на Python, производительность — как у нативного кода. Для учебных скриптов достаточно стандартной библиотеки (std/...); веб-фреймворки (Jester, Prologue) — следующий шаг после stdlib.
Как запускать примеры из главы
- Команда:
nim c -r имя.nim— компиляция и сразу запуск (аналогpython script.py). - Только проверка:
nim check имя.nim— быстрая диагностика без полной линковки. - Версия:
nim --version— убедитесь, что установлен Nim 2.x (ORC по умолчанию).
Связанные материалы:
- Функции и макросы —
proc, неявныйresult - Управляющие конструкции — циклы
for,while - HTTP как основа веб-интеграций — что происходит "под"
httpclient
Генератор паролей
Утилита показывает три приёма 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.
Что попробовать дальше
- Объединить JSON-трекер и HTTP — загрузка списка задач с URL (осторожно с доверенными источниками).
- Добавить
nimble initи вынестиsortFile/wordCountв модульsrc/utils.nim. - Прочитать архитектуру компиляции — почему
nim cсоздаёт каталогnimcacheс C-кодом.
См. также: Python — простые приложения (близкий синтаксис) · Nim — о разделе
Базовый разбор HTTP и HTTPS находится в отдельной статье — HTTP как основа веб-интеграций.