раздел 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, разбор текста, творческое программирование.урок 1 · Зачем Janet, лисп на один мегабайтопираются: урок 2
- Литералы и коллекцииЧисла, строки и буферы, ключевые слова и символы, nil и логика. Четыре коллекции двумя парами: массив и кортеж, таблица и структура.урок 3 · Литералы и коллекции: всё парамиопираются: урок 4, урок 5, урок 10, урок 25
- Определения, функции и чтение скобокdef и var, defn и анонимные функции, тело возвращает последнее выражение. Скобки читаются как дерево вызовов, специальные формы и splice.урок 4 · Определения, функции и чтение скобокопираются: урок 6, урок 12, урок 14, урок 18
- Установка и REPLСтавим Janet и jpm, заводим привычку разговаривать с языком через REPL. doc, тип значения, история, автодополнение.урок 2 · Установка и REPL: разговор вместо чтенияопираются: урок 3
Модель данных
- Значения и ссылкиПрисваивание не копирует. Три вида равенства, ключи словарей, freeze и thaw, глубокое и мелкое копирование.урок 5 · Значения и ссылки: почему (= @[1] @[1]) это falseопираются: урок 6, урок 18, урок 26
Модель исполнения
- Код как данные: парсер, quote, квазицитатаТри шага от текста к результату. Парсер отдаёт обычные структуры, quote останавливает вычисление, квазицитата собирает код по шаблону.урок 6 · Код как данные: парсер, quote и квазицитатаопираются: урок 7, урок 8
- Окружения, байткод и образыОкружение это таблица символов с метаданными. macex раскрывает макросы, disasm показывает байткод, dyn читает динамические переменные, образы замораживают состояние.урок 7 · Окружения, байткод и образыопираются: урок 16, урок 23
Макросы
- Макросы: функция вычисляет, макрос нетdefmacro и квазицитата на практике. Первый рабочий макрос, разница между аргументом-значением и аргументом-формой.урок 8 · Макросы: функция вычисляет, макрос нетопираются: урок 9, урок 12
- Гигиена макросов и три ловушкиМногократное вычисление аргумента, захват переменной, рекурсивная ссылка на себя. Лечение через with-syms и правило одного вычисления.урок 9 · Гигиена макросов и три ловушкиопираются: урок 23
- Макро-шалости: генерация API и условная компиляцияМакрос живёт в другом времени. Определения из макроса через upscope, генерация API из данных, макросы порождающие макросы, условная компиляция.урок 23 · Макро-шалости: генерация API и условная компиляция
PEG
- PEG: грамматики вместо регулярокПочему регулярки упираются в потолок. Примитивы PEG, комбинаторы последовательности и выбора, повторения, предикаты.урок 10 · PEG: грамматики вместо регулярокопираются: урок 11
- Захваты, именованные правила и парсер конфигаcapture, replace, group, свои функции над захватами. Именованные правила через таблицу-грамматику, работа с UTF-8 по байтам.урок 11 · Захваты, именованные правила и парсер конфигаопираются: урок 24
Файберы
- Событийный цикл, каналы и таймаутыev/go запускает зелёный поток, ev/chan связывает их сообщениями. Буферизация, ev/select, дедлайны и отмена.урок 13 · Событийный цикл, каналы и таймауты
- Файберы: один примитив вместо трёх подсистемfiber/new, resume и yield, состояния файбера. Генераторы и обработка ошибок оказываются одним и тем же механизмом.урок 12 · Файберы: один примитив вместо трёх подсистемопираются: урок 13
Поток выполнения
- Ветвления и matchИстинность в Janet: ложно только nil и false. if, when, unless, cond, case и структурный match со связыванием.урок 14 · Ветвления и matchопираются: урок 15
- Универсальный loop и нелокальные переходыОдин loop с глаголами :range, :in, :pairs, :down плюс фильтры. break, label и return, defer, треды-макросы.урок 15 · Универсальный loop и нелокальные переходыопираются: урок 22, урок 26
Модули
- Модули: файл, таблица, окружениеФормы import, приватные определения через defn-, модуль как таблица с метаданными, кэш загрузки и поиск файла.урок 16 · Модули: файл, таблица, окружениеопираются: урок 17, урок 22
- jpm, project.janet и публикацияДекларация проекта, объявление зависимостей, сборка исполняемого файла, установка и публикация пакета.урок 17 · jpm, project.janet и публикацияопираются: урок 19, урок 21
Полиморфизм
- Прототипы, методы и полиморфизмСинтаксис вызова метода, три случая которые легко перепутать, цепочка прототипов, конструкторы. Прототипы против замыканий.урок 18 · Прототипы, методы и полиморфизмопираются: урок 26
C и встраивание
- Встраивание Janet в программу на CАмальгамация janet.c плюс janet.h. Минимальный хост, обмен значениями, свои функции в скрипте, песочница и образы для быстрого старта.урок 20 · Встраивание Janet в программу на C
- Ксенофункции: FFI и нативные модулиДва пути к C. FFI без компиляции: ffi/native, ffi/lookup, ffi/signature. Нативный модуль на C с janet_wrap и сборкой через jpm.урок 19 · Ксенофункции: FFI и нативные модулиопираются: урок 20
Практика
- Карта стандартной библиотекиСправочник по задачам: коллекции, строки, разбор текста, числа, файлы, процессы, конкурентность, ошибки, метапрограммирование.урок 25 · Карта стандартной библиотеки
- Экосистема и что дальшеКарта библиотек по областям, идеи проектов на вечер, выходные и подольше, где искать помощь и как участвовать.урок 30 · Экосистема и что дальше
- Скриптинг вместо bashmain как точка входа, аргументы и коды возврата, разбор через spork/argparse, файлы и каталоги, запуск процессов, переменные окружения.урок 22 · Скриптинг вместо bashопираются: урок 24
- Тестирование и отладкаassert, error и errorf, запуск через jpm test, spork/test. Чтение трассировки стека, ловушка хвостовых вызовов, trace и точки останова.урок 21 · Тестирование и отладкаопираются: урок 24
- Сквозной проект: CLI-утилита подсчёта словКаркас проекта, разбор текста через PEG, подсчёт и сортировка, точка входа с аргументами, тесты, сборка и установка.урок 24 · Сквозной проект: утилита статистики по логамопираются: урок 30
Алгопрактика
- Алгозадачи 1: один проход и хеш-таблицаЗадачи уровня easy в двух стилях: Two Sum через таблицу, сделка одним проходом и через reduce, анаграммы, голосование Бойера и Мура, левая граница.урок 27 · Алгозадачи 1: один проход и хеш-таблицаопираются: урок 28
- Структуры данных: строим из четырёх кирпичейСтек, очередь тремя способами, персистентный cons-список, куча с компаратором, множество, префиксное дерево и ДНМ, всё из массивов и таблиц.урок 26 · Структуры данных: строим из четырёх кирпичейопираются: урок 27, урок 29
- Алгозадачи 2: указатели, окна и префиксыЧетыре паттерна уровня medium: два указателя на 3Sum, скользящее окно, префиксные суммы с таблицей, группировка по умному ключу, слияние интервалов.урок 28 · Алгозадачи 2: указатели, окна и префиксыопираются: урок 29
- Алгозадачи 3: графы, кучи и динамикаГраф как таблица массивов, острова обходом в глубину, алгоритм Кана, Дейкстра на куче из прошлого урока, размен монет сверху вниз и снизу вверх.урок 29 · Алгозадачи 3: графы, кучи и динамика