Карта стандартной библиотеки
открытый урокЭтот раздел читается без входа. Войди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти
Карта стандартной библиотеки
Урок-справочник, к которому возвращаются во время работы. Организован не по алфавиту, а по вопросу “что я хочу сделать”. Полный список имён всегда под рукой в 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честнее любого туториала.
Упражнения
Дальше
Дальше блок алгопрактики: собираем классические структуры данных из четырёх кирпичей и решаем задачи с собеседований, от разминки до графов и динамики. А закрывает раздел обзор экосистемы с идеями проектов.
домашка