В одном комментарие говорили то что "LISP" не говорили 50 лет. Теперь уже нет. Но вообще, в этом рассказе я расскажу как сделал Лисп с обработкой ошибок и сборкой мусора.

Его возможности

Он имеет прилично команд и функций.

Вот его команды и функции в целом:

  • if

  • defun

  • list

  • cond

  • nth

  • cons

  • append

  • remove

  • begin

  • quote

  • Цифры и строки

  • print

  • and, or и not

  • Вызовы функций

  • def

Так. Теперь главные вопрос по возможностям:

  1. Где макросы? Ответ: я до сих пор не понимаю как они работают хоть и понимаю их концепцию.

  2. Почему cond это команда? Потому что макросов нету.

Теперь главный секрет:

Мне пришлось делать list, nth, cons, append, remove, print как команды (built-in functions ещё называют).

Вы сразу заминусуете за плохой технический уровень (или как там).

Но, почему то мне было сложно понять как это сделать функционально.

А почему? Потому-что на функцию у меня класс Proc который имеет параметры args, name, body. Args, name это понятно.

Но вот body - это AST функции. Ну, из-за этого все проблемы.

Теперь о возможностях:

  • Сборщик мусора

  • Обработка ошибок (нормальная а не просто "найдены ошибки")

Ну и всё.

А, операции все есть кроме <= и >=.

Конец главы.

Схема сборки мусора.

Для начало об изначальной схеме:

  • Удалять переменные которые не используются долго

  • И также с функциями

Теперь как работает мой "gc 1.1":

  1. На каждой переменной стоит счётчик.

  2. Он считает на каждую переменную 20 строк (как правильно объяснить не знаю)

  3. Если же через эти 20 раз не было не каких изменений или использований: удаляет переменную.

Ну... Конечно звучит наверно не правильно, но информаций как сделать нормальный сборщик мусора не нашёл (очевидно потому-что не кто не пишет языки программирования со сборкой мусора и выкладывает это в простую статью).

Так что полностью "by me" (я так говорю).

Устройство языка

Устройство языка очень простое, это интерпретатор для небольшой REPL.

Ну... Как обычно:

  1. Лексер (его почти нету и он был взят со статьи Питера Норвига)

  2. Парсер (был взят со статьи Питера Норвига но с небольшими изменениями)

  3. Интерпретатор. Полностью создан мной.

Когда происходит сборка мусора? Во время интерпретации и перед интерпретации.

Также можно расширить интерпретатор и добавить поддержу много строчных программ.

Обработка ошибок

Весь механизм обработки ошибок находится в функции handleError.

Пока 3 ошибки (я научился программировать на Лиспе и не знаю других ошибок):

  1. Ошибка синтаксиса (invalid syntax). Происходит когда ты пишешь (lis 1 2 3) вместо (list 1 2 3)

  2. Инвалидное s-выражение (invalid s-expression). Происходит когда ты пишешь (+ 3 3 вместо (+ 3 3)

  3. Деление на ноль. Тут очевидно.

Вот как выводится сообщение о ошибке:

Error: invalid s-expression
    "+ 3 4)"
On line 2

Откуда строка? Ну... Вот как работаешь в REPL:

[1]> (list 1 2 3)
(1 2 3)
[2]> (if (= 0 1) (50) (10))
10
[3]> 

Вот так в REPL.

Примеры кода

(defun fac (n)
  (if (= n 1)
      (1)
      (* n (fac (- n 1)))))

В этом примере кода мы написали функцию факториала.

Ну и так далее. Ну вообще можно уже писать нормальные функции.

Заключение

Ну, теперь давайте объясню если статья выглядит плохо оформлена:

Во-первых, я писал на телефоне а на телефоне стоит этот Т9 (или как там).

Во-вторых, я писал статью ночью. Из-за чего бывают ошибки.

Ну, я надеюсь, вам понравилась моя идея, так что всем пока.

Комментарии (5)


  1. ivankudryavtsev
    30.06.2025 20:55

    Здесь мы явно пронаблюдали когнитивное искажение в духе "я ничего путнего не могу сделать или синдром самозванца".

    Итак:

    • я что-то сделал (впрочем статья вообще не говорит что Вы сделали - просто какой-то дамп сознания - ни кода, ни ссылки, ни-хе-ра);

    • поскольку я в себя не верю, надо заранее написать, что это отстой и что ожидаемая реакция от читателя - критика;

    • для полноты следования своему треку, оформлю-ка я еще все максимально говено, чтобы уж точно не промахнулись;

    • еще и напишу, что я знаю, что я говено оформил, но все равно выложил, потому что я заслуживаю только порицания и провала.

    Я что-то пропустил?

    PS: идея не понравилась: статья как ни крути - говно, даже без самоуничижительных пояснений.


  1. LeshaRB
    30.06.2025 20:55

    Во первых я писал на телефоне а на телефоне стоит этот Т9 (или как там).

    Написали Лисп, но не знаете как т9 называется, как там?

    Сумбурно маленькая статья, даже для курсовой работы студента


  1. Jijiki
    30.06.2025 20:55

    по сабжу, вот скобочки и вхождение

    (+ (- 2 1) ( / (- 2 3) (+ 3 4) ) (/ 2 1.5 )) гемор как по мне, это будет частая ситуация такого парсинга

    регистры по ходу действительно попроще, после таких конструкций оператор в С++ просто сказка )


  1. Ydav359
    30.06.2025 20:55

    В одном комментарии говорили. то что "LISP" не говорили 50 лет.

    Что?


  1. kmatveev
    30.06.2025 20:55

    После пластиковых статей, написанных LLM-ками, эта сумбурная безграмотная каша при чтении создаёт у меня ощущения тепла и умиления. Плюсов и минусов не ставил.