IDEmacs: A Visual Studio Code clone for Emacs 🔥 Горячее
IDEmacs представляет собой набор конфигураций для Emacs, созданный для упрощения входа в этот мощный редактор через имитацию интерфейса популярных IDE. Проект ориентирован на трех основных групп пользователей: программистов, переходящих с других IDE; начинающих Common Lisp и Scheme разработчиков, которым нужна функциональность Emacs без сложной настройки; а также непрограммистов, ищущих полнофункциональный редактор для Org, Markdown или LaTeX.
Ключевая особенность IDEmacs - это сочетание традиционного для Emacs управления с клавиатуры и поддержки GUI с мышью. В отличие от большинства стартовых комплектов для Emacs, здесь не скрываются графические элементы интерфейса, что значительно снижает порог входа для новичков. Проект позиционируется как временное решение ("заплатка") для текущей ситуации, когда Emacs с Sly/Geiser остается лучшей средой разработки для Lisp/Scheme, несмотря на его сложность для начинающих.
Комментарии (116)
- Пользователи спорят о модернизации Emacs: одни хотят сохранить ядро, но обновить UI (giancarlostoro), другие считают устаревший интерфейс фичей (raincole), третьи критикуют производительность (koiueo).
- Альтернативы Emacs обсуждаются активно: VS Code с плагинами (ruguo), OniVim (tiffanyh), Neovim с distant.nvim (pca006132), а также Electron-редакторы с Vim-подобными биндами (trenchpilgrim).
- Удалённая работа через SSH/TRAMP в Emacs возможна (brendyn, v9v), но имеет проблемы с задержками, в отличие от VS Code Remote (pca006132, blubber).
- Клавиатурные комбинации Emacs (C-x, C-c и др.) вызывают поляризацию мнений: одни считают их устаревшими (tom_), другие — неотъемлемой частью (ssivark).
- Сообщество Emacs сопротивляется радикальным изменениям UI, предпочитая кастомизацию через "стартовые пакеты" (ssivark), хотя часть видит в этом контркультурное противодействие прогрессу (stackghost).
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 и смена парадигмы ИИ.