раздел 31
Janet на практике
Janet, крошечный лисп, который весит мегабайт и зависит только от libc. Сначала база: REPL, литералы, изменяемые и неизменяемые близнецы коллекций, чтение скобок как дерева вызовов. Дальше модель исполнения: парсер отдаёт данные, компилятор превращает их в байткод, окружения держат определения, образы замораживают состояние процесса. На этом фундаменте вырастают макросы и гигиена, PEG-грамматики вместо регулярок, файберы как единый примитив для генераторов, ошибок и событийного цикла. Финал прикладной: модули и jpm, прототипы и полиморфизм, FFI и нативные модули, встраивание интерпретатора в программу на C, тесты, скриптинг и сквозной CLI-проект. Отдельным блоком алгопрактика: классические структуры данных из четырёх кирпичей и задачи с собеседований в двух стилях, императивном и функциональном. Язык, который целиком помещается в голову.
Начать разделРаздел открыт для всех. Войди, чтобы отмечать пройденные уроки, вести заметки и решать задачи в редакторе. войти
Уроки раздела
- Зачем Janet, лисп на один мегабайт
- Установка и REPL: разговор вместо чтения
- Литералы и коллекции: всё парами
- Определения, функции и чтение скобок
- Значения и ссылки: почему (= @[1] @[1]) это false
- Код как данные: парсер, quote и квазицитата
- Окружения, байткод и образы
- Макросы: функция вычисляет, макрос нет
- Гигиена макросов и три ловушки
- PEG: грамматики вместо регулярок
- Захваты, именованные правила и парсер конфига
- Файберы: один примитив вместо трёх подсистем
- Событийный цикл, каналы и таймауты
- Ветвления и match
- Универсальный loop и нелокальные переходы
- Модули: файл, таблица, окружение
- jpm, project.janet и публикация
- Прототипы, методы и полиморфизм
- Ксенофункции: FFI и нативные модули
- Встраивание Janet в программу на C
- Тестирование и отладка
- Скриптинг вместо bash
- Макро-шалости: генерация API и условная компиляция
- Сквозной проект: утилита статистики по логам
- Карта стандартной библиотеки
- Структуры данных: строим из четырёх кирпичей
- Алгозадачи 1: один проход и хеш-таблица
- Алгозадачи 2: указатели, окна и префиксы
- Алгозадачи 3: графы, кучи и динамика
- Экосистема и что дальше
Темы и кластеры
Старт
- Зачем JanetЛисп на мегабайт с одной зависимостью libc. Ниша: скрипты переросшие shell, встраивание в программы на C, разбор текста, творческое программирование.есть урок
- Литералы и коллекцииЧисла, строки и буферы, ключевые слова и символы, nil и логика. Четыре коллекции двумя парами: массив и кортеж, таблица и структура.есть урок
- Определения, функции и чтение скобокdef и var, defn и анонимные функции, тело возвращает последнее выражение. Скобки читаются как дерево вызовов, специальные формы и splice.есть урок
- Установка и REPLСтавим Janet и jpm, заводим привычку разговаривать с языком через REPL. doc, тип значения, история, автодополнение.есть урок
Модель данных
Модель исполнения
- Код как данные: парсер, quote, квазицитатаТри шага от текста к результату. Парсер отдаёт обычные структуры, quote останавливает вычисление, квазицитата собирает код по шаблону.есть урок
- Окружения, байткод и образыОкружение это таблица символов с метаданными. macex раскрывает макросы, disasm показывает байткод, dyn читает динамические переменные, образы замораживают состояние.есть урок
Макросы
- Макросы: функция вычисляет, макрос нетdefmacro и квазицитата на практике. Первый рабочий макрос, разница между аргументом-значением и аргументом-формой.есть урок
- Гигиена макросов и три ловушкиМногократное вычисление аргумента, захват переменной, рекурсивная ссылка на себя. Лечение через with-syms и правило одного вычисления.есть урок
- Макро-шалости: генерация API и условная компиляцияМакрос живёт в другом времени. Определения из макроса через upscope, генерация API из данных, макросы порождающие макросы, условная компиляция.есть урок
PEG
- PEG: грамматики вместо регулярокПочему регулярки упираются в потолок. Примитивы PEG, комбинаторы последовательности и выбора, повторения, предикаты.есть урок
- Захваты, именованные правила и парсер конфигаcapture, replace, group, свои функции над захватами. Именованные правила через таблицу-грамматику, работа с UTF-8 по байтам.есть урок
Файберы
- Событийный цикл, каналы и таймаутыev/go запускает зелёный поток, ev/chan связывает их сообщениями. Буферизация, ev/select, дедлайны и отмена.есть урок
- Файберы: один примитив вместо трёх подсистемfiber/new, resume и yield, состояния файбера. Генераторы и обработка ошибок оказываются одним и тем же механизмом.есть урок
Поток выполнения
Модули
Полиморфизм
C и встраивание
- Встраивание Janet в программу на CАмальгамация janet.c плюс janet.h. Минимальный хост, обмен значениями, свои функции в скрипте, песочница и образы для быстрого старта.есть урок
- Ксенофункции: FFI и нативные модулиДва пути к C. FFI без компиляции: ffi/native, ffi/lookup, ffi/signature. Нативный модуль на C с janet_wrap и сборкой через jpm.есть урок
Практика
- Карта стандартной библиотекиСправочник по задачам: коллекции, строки, разбор текста, числа, файлы, процессы, конкурентность, ошибки, метапрограммирование.есть урок
- Экосистема и что дальшеКарта библиотек по областям, идеи проектов на вечер, выходные и подольше, где искать помощь и как участвовать.есть урок
- Скриптинг вместо bashmain как точка входа, аргументы и коды возврата, разбор через spork/argparse, файлы и каталоги, запуск процессов, переменные окружения.есть урок
- Тестирование и отладкаassert, error и errorf, запуск через jpm test, spork/test. Чтение трассировки стека, ловушка хвостовых вызовов, trace и точки останова.есть урок
- Сквозной проект: CLI-утилита подсчёта словКаркас проекта, разбор текста через PEG, подсчёт и сортировка, точка входа с аргументами, тесты, сборка и установка.есть урок
Алгопрактика
- Алгозадачи 1: один проход и хеш-таблицаЗадачи уровня easy в двух стилях: Two Sum через таблицу, сделка одним проходом и через reduce, анаграммы, голосование Бойера и Мура, левая граница.есть урок
- Структуры данных: строим из четырёх кирпичейСтек, очередь тремя способами, персистентный cons-список, куча с компаратором, множество, префиксное дерево и ДНМ, всё из массивов и таблиц.есть урок
- Алгозадачи 2: указатели, окна и префиксыЧетыре паттерна уровня medium: два указателя на 3Sum, скользящее окно, префиксные суммы с таблицей, группировка по умному ключу, слияние интервалов.есть урок
- Алгозадачи 3: графы, кучи и динамикаГраф как таблица массивов, острова обходом в глубину, алгоритм Кана, Дейкстра на куче из прошлого урока, размен монет сверху вниз и снизу вверх.есть урок