Lisp: Notes on its Past and Future (1980)
LISP просуществовал 21 год к 1980 году, потому что представляет собой приблизительный локальный оптимум в пространстве языков программирования. Маккарти отмечает, что язык накопил некоторые "балластные" элементы, которые следует устранить, и упустил возможности для улучшений. Языку помогло бы совместное обслуживание, особенно в создании и поддержке библиотек программ. Компьютерно проверяемые доказательства корректности программ теперь возможны для чистого LISP и некоторых расширений, но для полного использования математической основы языка требуется больше теории и упрощения самого языка.
В примечании 1999 года Маккарти отмечает, что его взгляды 1980 года в основном соответствуют текущим. Основная идея заключается в том, что LISP, несмотря на свою долговечность, нуждается в очистке от лишних элементов и улучшении для раскрытия его полного потенциала, особенно в области формальных доказательств корректности программ.
Комментарии (95)
- Обсуждение показало, что Lisp и его диалекты всё ещё живы, но в нишевых формах: от Clojure на JVM до CHICKEN Scheme, компилирующего в C.
- Участники отмечают, что язык остаётся мощным инструментом, но его экосистема и сообщество сильно сократились, и нет признаков возвращения в мейнстрим.
- Некоторые подчеркнули, что Lisp-языки всё ещё важны для AI-исследований, генетического программирования и метапрограммирования.
- Сообщество отметило, что популярность языка упала не из-за технических причин, а из-за смены парадигмы в разработке ПО от символического AI к нейронным сетям и статистическому программированию.
Structure and Interpretation of Classical Mechanics (2014)
Классическая механика в интерпретации Сассмана и Виздомса представлена как вычислительная дисциплина, где математические структуры реализуются через программирование. Второе издание неофициальной HTML-версии книги MIT охватывает лагранжеву и гамильтонову механику, твердые тела и канонические преобразования, предлагая читателям глубокое понимание фундаментальных физических законов через призму вычислений.
Книга уникальна своим подходом к механике: она использует Scheme для реализации физических концепций, исследует такие темы как принцип стационарного действия, уравнения Эйлера-Лагранжа, тензор инерции и теорему Нётер. Особое внимание уделяется вычислительным методам анализа механических систем, включая поверхности сечения, экспоненциальное расхождение и теорему Лиувилля, что делает текст одновременно теоретическим и практическим руководством для изучающих классическую механику с вычислительной точки зрения.
Комментарии (37)
- Обсуждение вращается вокруг книги SICP и её влияния на образ мышления, а также вокруг трудностей запуска примеров кода и альтернативных реализаций.
- Участники обсуждают, как лучше всего подойти к изучению фундаментальных концептов, и какие инструменты (например, Scheme в Racket или scmutils в MIT Scheme) лучше всего подходят для этого.
- Также поднимается вопрос о том, как современные технологии и подходы могли бы облегчить обучение и взаимодействие с такими фундаментальными концептами.
- Некоторые участники делятся личными историями о том, как они познакомились с книгой и как она повлияла на их мышление и подход к программированию.
- Обсуждается идея написать современный аналог "Structure and Interpretation of Classical Mechanics" и "Structure and Interpretation of Quantum Mechanics" с использованием современных инструментов и подходов.
Practical Scheme
Practical Scheme — это коллекция библиотек и расширений для использования Scheme в качестве инструмента для повседневных задач системных инженеров и программистов. Автор, в настоящее время использующий Perl, стремится заменить его Scheme для обработки файлов, генерации отчетов, отслеживания процессов и создания GUI-оболочек. На сайте представлены как готовые приложения, так и библиотеки, некоторые из которых находятся в стадии alpha/beta. Основная цель проекта — сделать жизнь автора счастливее, без каких-либо гарантий для пользователей.
Среди ключевых инструментов — Gauche (версия 0.9.15, 2024), реализация R7RS Scheme с быстрым запуском и встроенными системными интерфейсами; WiLiKi, движок вики (0.6.2, 2014); и escm, фильтр для обработки Scheme-выражений в текстовых файлах. Также доступны библиотеки Gauche-gl (OpenGL, версия 0.6, 2014) и Gauche-gtk2 (GTK2, версия 0.6.1, 2022). Сайт содержит документы по применению Scheme в реальных проектах, включая создание баз данных для трекинга производства и обработку чисел с плавающей запятой.
Комментарии (42)
- Сайт не обновляется, поэтому список инструментов устарел, но в целом он всё ещё полезен как ориентир.
- Список не охватывает все реализации, но охватывает те, которые действительно важны.
- Существует несколько реализаций Scheme, которые могут компилировать в исполняемые файлы, включая Chez Scheme, Chicken, Gambit и Bigloo.
- Некоторые из них могут компилировать в исполняемые файлы, но не все.
- Некоторые из них могут компилировать в исполняемые файлы, но не все.
Code from MIT's 1986 SICP video lectures
Репозиторий felipap/sicp-code содержит оцифрованный код из знаменитых лекций MIT SICP 1986 года. Эти лекции, основанные на классическом учебнике "Структура и интерпретация компьютерных программ", считаются одними из самых влиятельных в истории компьютерных наук. Проект представляет собой историческую ценность, сохраняя для потомков примеры кода, которые формировали мышление поколений программистов.
Код в репозитории организован по лекциям и включает примеры на языке Scheme, демонстрирующие фундаментальные концепции функционального программирования и абстракций. Репозиторий служит не только образовательным ресурсом, но и памятником эволюции программирования, показывая, как фундаментальные идеи остаются актуальными десятилетиями после создания.
Комментарии (18)
- SICP и его лекции остаются актуальными, но код из книги 1985 года может не работать в современных реалиях.
- Сообщество активно делится ссылками на ресурсы: форматированная HTML-версия книги, PDF, EPUB, а также исходники примеров кода.
- Обсуждение затрагивает вопрос о том, насколько CS — это наука, и какие именно изменения в парадигме ML влияют на эту точку зрения.
- Участники делятся личными впечатлениями от чтения книги и просмотра лекций, а также обсуждают, как технический долгоживущий код может быть устаревшим.
Show HN: Kent Dybvig's Scheme Machine in 400 Lines of C (Heap-Memory Model)
Виртуальная машина для языка Scheme реализована на C с использованием кучи для хранения пар. Основана на модели из работы Дабвига «Three Implementation Models for Scheme», что делает её компактным учебным примером интерпретатора Lisp-подобных языков.
Лексический анализатор разбивает входную строку на токены, а парсер строит из них списковые структуры через функцию cons. Пары хранятся в статическом массиве text, что упрощает управление памятью. Поддерживаются базовые конструкции: атомы, списки, цитирование через апостров. Вывод структур реализован рекурсивно с учётом точечной нотации.
Комментарии (40)
- Обсуждение производительности и особенностей различных реализаций Scheme, включая Chez Scheme, MIT Scheme и другие.
- Упоминание роли Кента Дибвига как создателя Chez Scheme и его влияния как преподавателя и исследователя.
- Вопросы о технических деталях и возможных ошибках в представленном коде, включая проблемы с указателями и порядком вычислений.
- Идеи о бутстраппинге компиляторов и интерпретаторов, включая использование LLM для генерации ассемблерного кода.
- Общие положительные отзывы о минималистичных и элегантных реализациях Scheme, таких как обсуждаемый код.
Scm2wasm: A Scheme to WASM compiler in 600 lines of C, making use of WASM GC
Разработан экспериментальный компилятор Scheme в WebAssembly, который автор сам называет «очень плохим» и минималистичным. Он написан преимущественно на C (97.2%) и способен преобразовывать код Scheme в валидный WASM-модуль, который затем можно запускать через Wasmtime.
Процесс включает компиляцию исходного кода, валидацию и дизассемблирование выходного файла. Пример демонстрирует выполнение простой программы, возвращающей число 30. Проект служит учебным примером, показывающим базовые принципы трансляции функционального языка в низкоуровневый бинарный формат.
Комментарии (23)
- Упомянуты проекты на WebAssembly: минимальный OOP рантайм, Forth, компилятор в твите и книга о WebAssembly.
- Обсуждается компилятор Scheme в WebAssembly (Guile Hoot), его особенности и поддержка WASM-GC.
- Затронуты технические вопросы: возможность использования как интерпретатора, поддержка tail call и call/cc.
- Отмечается важность самодостаточных инструментов и независимости от платформ.
- Поднята тема различий между Asm.js и WebAssembly в контексте исторического развития.
Комментарии (31)
- Обсуждаются исторические Lisp-процессоры (SCHEME-78, Symbolics 'Ivory', TI) и причины их коммерческого неуспеха: высокая стоимость, проприетарность и несоответствие массовому рынку.
- Выдвигается тезис, что даже если бы такие процессоры выбрали для IBM PC, они бы проиграли из-за архитектурных недостатков и быстрого прогресса традиционных CPU и компиляторов.
- Отмечается связь между разработчиками SCHEME-78 (Гай Стил, Дэнни Хиллис) и их работой в MIT, а также последующим созданием Connection Machine.
- Упоминается важность работ Линн Конвей по VLSI-дизайну и курса, на котором студенты впервые проектировали и производили чипы.
- Обсуждается превосходство специализированных сред, подобных Interlisp-D, над современными инструментами разработки.
Advanced Scheme Techniques (2004) [pdf]
- PDF-файл повреждён: вместо текста — поток сжатых байтов.
- Содержимое невозможно прочитать без распаковки и декодирования.
- Перевод и сокращение не применимы: исходных данных нет.
Комментарии (15)
- Scheme обманчиво прост, но сложен для компиляции: гигиеничные макросы и продолжения первого класса требуют особых подходов.
- CPS-преобразование — популярный, но не единственный способ реализовать continuations; подходят и байт-код/виртуальные машины, и другие схемы.
- Реализация closures и правильная работа с пустым списком (не «ложь» в Scheme) добавляют сложности.
- Полезны материалы: диссертация Dybviga, доклад Олега Киселёва, статья о секвентном исчислении как IR.
Anonymous recursive functions in Racket
Репозиторий показывает, как в Racket писать анонимные рекурсивные функции без letrec и имен.
Ключевая идея — Y-комбинатор: лямбда получает себя как аргумент и вызывает его для следующего шага.
(define Y
(λ (f)
((λ (x) (x x))
(λ (x) (f (λ (a) ((x x) a)))))))
((Y (λ (fact)
(λ (n)
(if (zero? n) 1 (* n (fact (sub1 n)))))))
5) ; 120
Такой приём работает для любой рекурсии: факториал, fib, обход списков и т.д.
Комментарии (37)
- Обсуждение началось с примера анонимной рекурсии на Racket; оказалось, что код совместим с любым R6RS-Scheme, включая проект scheme-rs.
- Участники сравнили подходы: в Clojure нужен явный
recur, в Racket хвостовые вызовы оптимизируются автоматически. - Кто-то спросил, стоит ли брать Racket для повторного изучения ФП; советуют почитать «zen of Racket» и быть готовым к узкой, но мощной экосистеме.
- Появились порты идеи на Python и Go (через Y-комбинатор), но часть людей предпочла бы обычный цикл для отладки.
- Сообщество предупреждает: в нишевых языках придётся уметь докручивать библиотеки «с нуля» и держать редких специалистов.
Lisp from Nothing, Second Edition 🔥 Горячее
LISP FROM NOTHING
344 стр., 2025, Lulu Press, 6"×9", 19 иллюстраций, код бесплатно.
Купить: мягкий переплёт | твёрдый | PDF
Исходники | Превью (PDF) | Опечатки | Видео-обзор
Книга исследует минимальный LISP, способный интерпретировать и компилировать себя, и показывает, каким был хакинг в эпоху перфокарт и мейнфреймов. Во втором издании добавлена глава о связи LISP с λ-исчислением, улучшены макросы и стиль.
Примеры кода
- Метациркулярный интерпретатор: CL, Scheme
- Компилятор (~400 строк): liscmp.lisp.html
- Система: lisp.lisp.html
- Сборщик мусора: gc.lisp.html
Весь код книги (~100 КБ)
λ-исчисление в Scheme (~6 КБ)
Генератор перфокарт Postscript
Обложка главы «Let There Be LISP»
Комментарии (97)
- Читатели восторженно отзываются о сайте и книгах Нильса М. Хольма, называя их «личной поэзией» и «культурными артефактами», созданными ради самого процесса.
- Автор подтверждает: главное для него — красота и простота изложения, а не практическая польза или научная новизна.
- Покупатели жалуются на выбор: «хочется всё сразу», но автор советует начать с одной книги и прислал шпаргалку «какую выбрать».
- Обсуждаются входные требования: книга не для новичков; рекомендуют The Little Schemer, ANSI Common Lisp и A Gentle Introduction.
- Возник спор о названии «Lisp from Nothing» при пометке «не вводная книга»; автор уточняет, что «nothing» значит «с нуля», а не «для нулевых».
GNU Artanis – A fast web application framework for Scheme
GNU Artanis — первый production-ready веб-фреймворк на Scheme. Лёгкий, быстрый, с поддержкой JSON/XML/SXML, WebSocket, i18n, MySQL/SQLite/PostgreSQL, кэширования, шаблонов и статики.
(use-modules (artanis artanis))
(init-server)
(get "/hello" (λ () "hello world"))
(run #:port 8080)
Скачать
Документация
Официальное руководство
Исходники
- Savannah: https://savannah.gnu.org/projects/artanis
- GitLab: https://gitlab.com/hardenedlinux/artanis
История
2013 — рождение на hack-potluck Guile; 2014 — награда «Lisp In Summer Projects»; 2015 — первая стабильная версия и вступление в GNU; 2021 — переход под крыло HardenedLinux.
Контакты
Почта: artanis@gnu.org
GitLab: https://gitlab.com/hardenedlinux/artanis
Комментарии (65)
- Участники обсуждают фреймворк Artanis для Guile Scheme: кто-то хвалит простоту синтаксиса и встроенный веб-сервер, кто-то жалуется на отсутствие CSRF, 404-ссылок и слабое tooling.
- Почему Guile не стал популярен? Недостаток LSP, отладки, туториалов и узкая аудитория.
- Название «Artanis» — отсылка к Sinatra (Ruby) и палиндрому «Sinatra» задом-наперёд.
- Сайт без JS и шрифтов выглядит чисто, но кто-то считает текст слишком крупным и структуру странной.
- По безопасности: при грамотных разработчиках Scheme-системы могут быть безопаснее «обычных».
Do I not like Ruby anymore? (2024)
Перешёл в компанию, где стек — Python. Выбор был не из-за языка: Python мне всегда казался гигантским красным флагом. Тем не менее, начинаю к нему привыкать.
Почему я любил Ruby
Ruby — мой первый «язык-любовь»: всё объект, if можно переписать блоками, method_missing позволяет метапрограммировать. Он черпал у Smalltalk и Lisp, и это вдохновляло.
Почему ненавидел Python
Python казался «хуже Ruby» и «ещё хуже Scheme». if — оператор, а не выражение; lambda уродливые; до Python 3 print вообще был оператором. Один «правильный» способ делать всё раздражал.
Типы для нетипизированного
Потом пришёл TypeScript: мощная система типов, narrowing, conditional types. Плохие конструкции языка прощаются статическим анализом.
Я изменился
TypeScript научил: отсутствие match или if-выражения пережить, если компилятор проверит инициализацию. Rust показал, что мутабельность — не зло.
Python изменился
Теперь в Python есть type hints, match с деструктуризацией, а print — функция.
Комментарии (127)
- Автор рассказал, как после появления VSCode и LSP перестал использовать языки без типов и теперь не хочет возвращаться к Ruby без нормальной типизации.
- Участники обсуждают, что Ruby остаётся элегантным и «радостным», но его отказ от постепенной типизации (включая Sorbet) отталкивает многих.
- Python, напротив, эволюционирует: появились аннотации типов, LSP, но язык стал сложнее и уже не «выучить за выходные».
- Некоторые считают, что страсть к Ruby — это ностальгия, а промышленность требует стабильности и инструментов, которые дают статические языки.
- Общий вывод: выбор языка всё чаще диктуется экосистемой, инструментами и личными приоритетами, а не чистой «красотой» синтаксиса.
Compiling a Lisp: Lambda lifting
Переписал Ghuloum-туториал на Python (~300 строк). Убрал читалку S-выражений и бинарный код — теперь текстовая ассемблерная печать.
Lambda-lifting требует:
- знать связанные переменные;
- собирать свободные переменные лямбд;
- накапливать создаваемые
code-объекты.
Связывают let и lambda; для них обновляем окружение.
Lifter
class LambdaConverter:
def __init__(self):
self.labels = {}
def convert(self, expr, bound, free):
match expr:
case int() | Char() | bool():
return expr
case str() if expr in bound or expr in BUILTINS:
return expr
case str():
free.add(expr)
return expr
case ["if", t, c, a]:
return ["if",
self.convert(t, bound, free),
self.convert(c, bound, free),
self.convert(a, bound, free)]
lift_lambdas запускает обход и возвращает (labels …).
Lambda
Лямбда:
- связывает параметры;
- выделяет код;
- захватывает внешнее окружение.
Пример:
(lambda () x) ; x свободна
превращается в
(labels ((f0 (code () (x) x)))
(closure f0 x))
Даже если x связан снаружи, внутри лямбды он считается свободным.
Комментарии (15)
- Участники рекомендуют три современные книги по компиляторам, вдохновлённые статьёй Ghuloum: «Writing a C Compiler» (Sandler), «Essentials of Compilation» на Racket и Python (Siek).
- Обсуждали «lambda lifting»: преобразование, выносящее замыкания наверх, уменьшая их размер вплоть до полного исчезновения.
- Уточнили, что «lambda lifting» в статье связан с разделом 3.11 о сложных константах в Scheme.
- Разбирали, почему современный ИИ использует Python, а не Lisp: удобство как «клея» для C++/CUDA, упадок доли рынка Lisp и смена парадигмы ИИ.