Раздел 31 · Janet на практике

Карта стандартной библиотеки

junior~25 мин

открытый урокЭтот раздел читается без входа. Войди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

Карта стандартной библиотеки

Урок-справочник, к которому возвращаются во время работы. Организован не по алфавиту, а по вопросу “что я хочу сделать”. Полный список имён всегда под рукой в REPL через (doc), здесь только то, что нужно чаще всего.

Как этим пользоваться

Не читай подряд. Сначала таблица-скелет: десять полок, на которых лежит почти всё. Потом поиск: набери задачу своими словами и посмотри форму. Отдельная галочка в поиске показывает только записи с ловушками: это самая полезная выборка, если ты уже что-то пишешь и оно ведёт себя странно.

Карта: десять полок

ПолкаЗачем идёшьКлючевые формы
string/резать и клеить текстsplit, join, trim, format, has-prefix?
буферыизменяемые байты, сборка больших строк@"", buffer/push-string, string для заморозки
array/ и tuple/спискиpush, concat, slice, sort, sorted
таблицы и структурысловари, объекты, окруженияget, put, keys, table/setproto
map, filter, reduceобработка коллекцийплюс each, keep, frequencies
peg/разбор текстаmatch, compile, find-all, replace-all
os/файлы как объекты системы, процессы, окружениеdir, stat, execute, getenv, exit
file/ со slurp и spitсодержимое файловopen, read, slurp, spit, with
ev/конкурентностьspawn, chan, give, take, with-deadline
sporkбатарейки второго рядаargparse, path, sh, json, test

Этого скелета хватает, чтобы знать, в какой модуль смотреть. Конкретную форму ищи в стенде:

Сквозные ловушки

Через весь раздел прошли несколько мотивов. Они собраны здесь вместе, потому что ловят одинаково и в первый день, и на третьем месяце.

Строка это байты. Отсюда (length "привет") равно 12, классы :a в PEG не ловят кириллицу, а strlen через FFI считает то же самое число. Для посимвольной работы бери пакет utf8. Разбор: литералы и захваты PEG.

= строг к типам. Все три дают false по одной и той же причине:

(= @[1] [1])                    # массив против кортежа
(= "текст" (slurp "файл"))      # строка против буфера
(= 5 (strlen "hello"))          # число Janet против целого из C

Лечится в трёх местах по-разному: deep= для коллекций, (string ...) для буфера, int/to-number или compare= для целых из C. Разбор: значения и ссылки и FFI.

Почти всё это обычная таблица. Окружение, модуль, объект с прототипом. Поэтому их можно перебирать, менять и строить программно, и поэтому же интроспекция в Janet не требует особого API. Разбор: окружения и таблицы и полиморфизм.

Функции обработки коллекций возвращают массив. map, filter, keys, values, pairs отдают изменяемый результат, даже если на вход дали кортеж. Нужен неизменяемый, заворачивай в freeze из урока про значения и ссылки.

Ложны только nil и false. Ноль, пустая строка и пустой массив истинны. Проверку на пустоту пиши явно. Разбор: ветвления.

Тихие nil там, где ожидается ошибка. (:ключ структура) при не-функции под ключом, (get таблица @[1 2]) с изменяемым ключом, case без ветки “иначе”. Все три молчат.

Шесть решений, которые не надо гуглить

Небольшой набор, который окупается тем, что не приходится каждый раз лезть проверять.

ЧтоФорма
значение по умолчанию при чтениитретий аргумент get
гарантированная уборкаdefer и with
ошибка как данныеprotect, а не try
накопить и отдать наружу@[] внутри, freeze на выходе
разбор текста сложнее одного шаблонаPEG, а не string/find в цикле
много одинаковых вызововсначала функция, макрос только если без него нельзя

Куда смотреть дальше

(doc имя) в REPL отвечает быстрее любого справочника и работает без интернета. (doc) без аргументов печатает все доступные имена, а Tab дополняет по префиксу: набери string/ и посмотри весь модуль.

И отдельная рекомендация, необычная для языков: читай boot.janet. Почти вся стандартная библиотека Janet, включая when, cond, loop и each, написана на самом Janet и лежит в одном файле в исходниках. Когда непонятно, как работает конструкция, посмотри её исходник. По нему видно, как пишут идиоматичный Janet, и заодно где проходит граница между языком и библиотекой.

Что запомнить

  • Строка это байты, и эта ловушка сквозная: она же в PEG, она же в FFI.
  • = строг к типам: deep= для коллекций, string для буфера, compare= для целых из C.
  • Почти всё в Janet это таблица, отсюда дешёвая интроспекция.
  • (doc имя) в REPL быстрее любого справочника, а boot.janet честнее любого туториала.

Упражнения

Дальше

Дальше блок алгопрактики: собираем классические структуры данных из четырёх кирпичей и решаем задачи с собеседований, от разминки до графов и динамики. А закрывает раздел обзор экосистемы с идеями проектов.

домашка

Домашка