Личный проектScala

Scalisp — интерпретатор Lisp на Scala

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

Scalisp — интерпретатор Lisp на Scala

Интерпретатор простого диалекта 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"