Комментарии 9
но уже высокоуровневая часть Паскаль-подобная и по причине заброшенности проекта не особо представляющий интерес для практического применения, но интересен с эзотерической стороны его оценки реализованных идей. :)
P.S. Библиотека времени выполнения 2-ух стековая машина.
Что здесь "красиво ужасного"? Обычный лисп.
«красиво ужасного» — механизма расширения Лисп языка из статьи?
но по мне, к примеру, функциональность языка Factor, возможно более ужасна с точки зрения Лисп программистов вне рассмотрения его VM.
P.S. Для реализации Лисп есть и готовые инструменты и методолгии для минимизации придумывания своих «велосипедов».
Лисп, но несовсем обычный. Он эзотерический (в то время как LISP вполне себе нормальный язык программирования, в практическом смысле этого слова) и примитивный (даже с точки зрения LISP языков).
Эзотеричность выражается в его применении, а скорее даже в невозможности его нормального применения. Всё выполняется через неоптимизированные рекурсии, не существует ни ввода, ни вывода, почти каждая операция - это большое количество операций инкремента и декремента, которые находятся в рекурсивных вызовах. Это всё есть его ужасная сторона.
Примитивность его в нескольких деталях. Первая - это количество инструкций языка, их всего три штуки include, define и if. Не существует ни операций сложения, вычитания, умножения, деления и т.д. Тем не менее, он способен в себя их вбирать, но "соединяясь" с низкоуровневой частью. Вторая - это примитивность исполнения, где по умолчанию я в него вгрузил лишь операции инкремента, декремента и выражения больше, равно. Все остальные действия язык проводит сквозь уже свои инструкции, создавая сложение, вычитание и т.п. операции. Это всё есть его красивая сторона.
Это не Lisp. Пусть вас не смущают скобочки.
В универе давно делал VM Пролога, тоже стековую, +шитый код.
Добавьте в компиляторе "ассемблера" модификатор inline. Тогда не нужно будет постоянно перекладывать из пустого в порожнее в базовых операциях _inc _dec и т.д.
Вот как можно будет делать.
labl _inc
inline inc
labl _dec
inline dec
Я бы изменил операции load
и store
до версий с аргументами как у операции push, только у них аргумент это смешение относительно верхушки стека и сделал бы его или всегда положительным, или отрицательным как у вас, но с положительными числами работать легче. При этом операция store сразу выталкивает верхушку стека.
load 2 ; вместо push -2; load
load 0 ; продублировать стек
store 0 ; аналог pop получается, но лучше pop оставить тоже
Добавил бы в ассемблер инструкцию nop, тогда
(define (ret x)
(_ret x))
labl _ret
inline nop
; Как вариант без nop
labl _dec
inline load 0
inline store 0 ; или просто pop
ALLang. Расшифровка его звучит так: Another LISP Language
Ваш ALLang совсем не Lisp! Ведь Lisp это не только круглые скобки, это ещё и cons, car и списки как основа языка. А ещё eval интерпретирующий список как код.
Бесполезный и красиво ужасный язык программирования ALLang