Scalisp — интерпретатор Lisp на Scala
Интерпретатор простого диалекта Lisp на Scala с REPL и запуском файлов — специальные формы и встроенные функции разнесены по отдельным пакетам.

Интерпретатор простого диалекта Lisp, написанный на Scala — с REPL и запуском файлов. После дисциплины «Языки программирования» я вдохновился и захотел разобраться, как устроены интерпретаторы изнутри, и Lisp с его однородным синтаксисом для этого подходит лучше всего.
Задача
Интерпретатор должен уметь исполнять базовые формы (define, if, lambda, let и подобные) и набор встроенных функций.
Архитектура
Специальные формы (то, что обрабатывается интерпретатором до вычисления аргументов — if, define, lambda) живут в пакете evaluator, а обычные встроенные функции (то, что сначала вычисляет свои аргументы, а потом применяется — арифметика, работа со списками) — в пакете builtins.
- src/main/scala/
- ast/Абстрактное синтаксическое дерево (AST) и типы значений
- Expr.scala
- Value.scala
- builtins/Встроенные функции и операции
- ArithmeticOps.scalaАрифметические операции
- Builtins.scalaРегистрация встроенных функций и операций
- ComparisonOps.scalaОперации сравнения
- ListOps.scalaОперации над списками
- entrypoint/Точка входа в программу
- FileRunner.scala
- REPL.scala
- env/Окружение интерпретатора, хранящее переменные и функции
- evaluator/Логика вычисления выражений AST
- parser/Парсер исходного кода в AST
- utils/Утилиты для печати и форматирования вывода
Запуск
Для REPL и запуска файлов удобно использовать just:
just repl # REPL
just run path/to/file.lsp # выполнить файл
Без just — напрямую через sbt:
sbt run
sbt "runMain entrypoint.runFile path/to/file.lsp"