LINUX.ORG.RU

Кустарный интерпретатор Лиспа - что исправить, что добавить?

 


1

1

Здравствуйте ) Я здесь человек новый, но успел почитать некоторые темы и получить представление о стиле общения на этом форуме ) И тем не менее, рискнул зарегистрироваться и создать эту тему, в которой хочется (помимо обычного развития подобных тем здесь )) по-возможности конструктивно обсудить такой вопрос - я потихоньку пишу интерпретатор Лиспа, на Хаскеле. Особых претензий на мировое господство конечно нет, скорость/оптимизации/сборка мусора и т.п. не заботят, практического применения не предусматривается, исключительно учебные/исследовательские задачи. Но хотелось бы реализовать максимально широкий и интересный функционал. Знаю про «схему за 48 часов», какие-то идеи взял оттуда, какие-то не понял, какие-то не понравились как там сделаны и сделал по своему. Что есть сейчас - иерархическое мутабельное дерево окружений (как SICP завещал), функции как полноценные объекты первого класса, простые макросы - раскрываются в рантайме и тоже объекты первого класса, с их помощью реализованы отложенные вычисления и на нем уже ленивые бесконечные списки-потоки. Хотел бы обсудить вопрос - что можно сделать еще, что исправить. Примеры решения простейших задачек - код скрипта и результат могу предоставить, если кому будет интересно. Также постараюсь ответить на вопросы по реализации/возможностям.


Ответ на: комментарий от anonymous

Все называют это евалом.

Эвал у меня тоже есть, но я считаю его обычной особой формой.

Будет

Не верю. Или кот в студию. Если что - СИКП читал, отсылать не надо.

Ivana
() автор топика
Ответ на: комментарий от anonymous

А, ну тогда знай, что это использование той же композиции вместо использования аргументов функции явно, как пример

Пока не понял, но подумаю над этим. Вообще за время жизни этой темы я уже много новых слов и понятий узнал, осталось переварить и осознать :)

Ivana
() автор топика
Ответ на: комментарий от anonymous

Я просто не успеваю понимать все - большой поток мыслевыражений в этой теме. Но потом я обязательно отделю зерна от плевел и пойму что смогу.

Ivana
() автор топика
Ответ на: комментарий от anonymous

Ааааа, так вы про моноид эндоморфизма под композицией? Так бы и говорили, в нормальных терминах, а то Tacit programming какие-то )))) Тогда да, все понятно, есть и реализовано )

Ivana
() автор топика
Ответ на: комментарий от anonymous

Я уже слазил в википедию и посмотрел этот термин. Кстати, не менее лолшто, чем мой вариант - эндоморфизм это функция из домена в кодомен, на их множестве определена бинарная операция композиции, которая ассоциативна и имеет единицу - тождественную функцию - значит это моноид по определению последнего ) Это я к тому, что анонимусы, которые считают себя особо умнее ТС и бравирующие жаргонизмами (это не васкасается, а других отметившихся персонажей) выглядят порой смешно )

Ivana
() автор топика
Ответ на: комментарий от anonymous

Концепция Лиспа оставляет свободу реализации когда именно раскрывать макрос

Только тогда это не называется макросами. Просто функции. Обычные. Макрос раскрывается до выполнения _по определению_.

Уверен, что грамотные участники присутствуют на этом форуме, и им все понятно и без этого, но все-таки процитирую:

Когда Lisp интерпретируется, а не компилируется, разница между временем раскрытия макросов и временем выполнения менее очевидна, так как они «переплетены» во времени (temporally intertwined). Также стандарт языка не специфицирует в точности того, как интерпретатор должен обрабатывать макросы: он может раскрывать все макросы в интерпретируемой форме, а затем интерпретировать полученный код, или же он может начать с непосредственно интерпретирования формы и раскрывать макросы при их встрече. В обоих случаях макросам всегда передаются невычисленные объекты Lisp, представляющие подформы формы макроса, и задачей макроса все также является генерирование кода, который затем осуществит какие-то действия, а не непосредственное осуществление этих действий.

Ivana
() автор топика
Ответ на: комментарий от Ivana

Эвал у меня тоже есть, но я считаю его обычной особой формой.

евал - это просто функция. При чем тут спецформы?

anonymous
()
Ответ на: комментарий от Ivana

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

Если же считать макросами то, что ты предлагаешь, то, сам подумай, как отличить макрос от обычной функции? Тогда макросов вообще не существует, по-твоему.

anonymous
()
Ответ на: комментарий от anonymous

евал - это просто функция. При чем тут спецформы?

Я навскидку не додумался как реализовать эвал в виде обычной функции, зато сразу понял как реализовать его в виде особой формы, что и сделал. Я подумаю можно ли и как реализовать его как функцию. ЗЫ у меня например макросы появились только в последние 2 дня, а играться с программами хотелось и до этого, поэтому у меня нет ифов и летов, а есть особые формы конд и дефн отдельно от дефа. Но что делать особой формой а что реализовывать в виде сахара над ними с использованием макросов имхо вопрос не самый принципиальный.

Ivana
() автор топика

Какие задачи ты ставишь создавая новый интерпретатор и чем не устраивают существующие решения?

at ★★
()
Ответ на: комментарий от anonymous

Я подумал в меру скромных возможностей, почитал интернеты и реализовал единственный простейший вариант который я понял. И он отличается от функции по многим параметрам - и выполняется в окружении в котором вызывается, а не в локальном как функция, и аргументы не вычисляются а подставляются как переданы в виде форм, и т.п. Но вы конечно можете считать это вариантом «функции», в более широкой трактовке этого термина. А мне удобно четко разделять это поведение и называть макрос макросом.

Ivana
() автор топика
Ответ на: комментарий от at

Какие задачи ты ставишь создавая новый интерпретатор и чем не устраивают существующие решения?

Хороший вопрос по делу. Частично уже говорил, но повторюсь: - понять концепции самому на примере самостоятельной их реализации. Какие - какие получится понять и реализовать. - возможно придумать свои варианты известных или не очень фич и реализовать их. - в свете вышесказанного знать узкие места и оптимальные способы написания кода на существующих диалектах Существующих интерпретаторов я видел 2 - схемы на схеме в СИКПе и схема же за 48 часов на Хаскеле. Не устраивают много чем, но главное - их не я написал ) А свой могу раскурочить как хочу. Вдобавок, насколько я помню, макросов тех же нет ни в том ни в другом, а мне очень хотелось понять что это такое в лиспе.

Ivana
() автор топика

аффтар, все правильно делаешь, кроме попытки общаться с лисперами (http://c2.com/cgi/wiki?SocialProblemsOfLisp)

алсо: Almost everybody has their own lisp implementation. Some programmers' dogs and cats probably have their own lisp implementations as well. This is great, but too often I see people omit some of the obscure but critical features that make lisp uniquely wonderful. These include read macros like #. and backreferences, gensyms, and properly escaped symbol names. If you're going to waste everybody's time with yet another lisp, at least do it right damnit. (https://github.com/JeffBezanson/femtolisp)

anonymous
()
Ответ на: комментарий от Ivana

Если основная причина это

но главное - их не я написал )

то, максимум, что ты напишешь это лабу «Реализация интерпретатора Лиспа на Хаскеле», то есть с нулевым практическим результатом. Если бы причина была в

в реализации Х, не устраивает Y, я считаю что надо делать Z, потому что...

это ещё можно было бы обсудить

at ★★
()
Ответ на: комментарий от at

at ★★, ну у каждого свой уровень знания предмета и соответственно требований к интересному контенту. Если бы я знал лисп, а еще лучше - несколько разных его диалектов, их различия, видел бы моменты которые с моей т.з. реализованы плохо или неоптимально, тогда бы да, я может создал бы тему с заголовком - смотрите что умеет мой интерпретатор такого крутого, что не умеют другие. А без этого и вам и еще как минимум одному участнику скучно и непонятно зачем. А мне, например, приятно когда реализую некоторые давно известные вещи, типа отложенных вычислений и ленивых списков или тех же макросов, хотя они у меня сильно ограничены по функционалу и могут вызвать надменное презрение типа «жалкое убожество». Но с другой стороны я и не знаю еще что от них требовать в полном объеме. Вот такие разные бывают мотивы и действия.

Ivana
() автор топика
Ответ на: комментарий от Ivana

ЗЗЫ никто не запросил примеров кода (пусть простого и тривиального и давно известного) что умеет выполнять мой интерпретатор, чтобы потом подвергнуть его массовой некультурной обструкции, а я бы смог из этих тонн де...структивных комментариев выловить крупицы конструктивной критики и улучшить свой интерпретер. А сырцы на Хаскеле запросили многие, и что? Сидят и втыкают типа «лолшто это такое» как на моноид композиции эндоморфизмов? ) Вот и обсуждение...

Ivana
() автор топика
Ответ на: комментарий от Ivana

Писать ты можешь, всё что тебе интересно, но, согласись, что при наличии конкретных вопросов/предложений обсуждение будет более интересным.

at ★★
()
Ответ на: комментарий от at

Я не пользовался git-ом и т.п. сервисами, выложу текстом код библиотеки для обработки строгих списков (файл lib.txt) http://freetexthost.com/gautx6cq43 код тестовых примеров (файл test.txt) http://freetexthost.com/sqlpiilzsy результат работы - вывод в окно интерпретатора Хаскеля http://freetexthost.com/xqx3jrbup2

код других тестовых примеров (файл test.txt) http://freetexthost.com/5n1i3uy5y3 результат работы http://freetexthost.com/n6soq1qbc1

Ivana
() автор топика

ТОпик не читал. Кто-нибудь написал уже «ненужно!»?

anonymous
()

интерпретатор Лиспа, на Хаскеле

C-C-COMBO!

comp00 ★★★★
()
Ответ на: комментарий от Weres

Похоже, не читали пост. Автор посоветоваться хочет что ещё рассмотреть, чтобы подучиться. Если есть что ответить - отвечайте. Я как придумаю, тоже напишу.

turtle_bazon ★★★★★
()

интерпретатор Лиспа, на Хаскеле

Штангист-борщевик, все в машину!

no-such-file ★★★★★
()

Мамка-то хоть вкусный борщ варит?

anonymous
()
Ответ на: комментарий от turtle_bazon

Макросы в компайл-тайме раскрываются, не?

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

Про гитхаб наверное вы правы, там должно быть более удобно - все файлы в одном флаконе, форматирование пробелами (существенное для работоспособности Хаскельного кода) не уничтожается, и т.п. Надо будет поспрашивать у умельцев как туда проект выкладывать и оформлять.

ЗЫ будет интересно узнать если придумаете что еще реализовать. Хотя для начала те же макросы имхо надо нормально погонять, у меня подозрение что они у меня ограничены по возможностям сильно. Знать бы еще все их требуемые возможности...

Ivana
() автор топика

1С'ник пишет интерпретатор lisp на haskell

Невиданное доселе унижение борщевиков и штангистов =)

Virtuos86 ★★★★★
()
Ответ на: комментарий от anonymous

Some programmers' dogs and cats probably have their own lisp implementations as well.

Лол, вся суть лиспа.

anonymous
()
Ответ на: комментарий от turtle_bazon

Ну, наверное, открой для себя github, выложи туда, ссылку сюда.

Не прошло и времени как я попробовал-таки гит и создал репозиторий с проектом - вот ссылка https://github.com/Ivana-/Liscript Второй набор тестов не подгружал еще. Наверное позже закоммичу.

Про Лиспер.ру - я заходил и на него и на другой русскоязычный ресурс (Лисп.ру или что-то подобное) - по обоим у меня сложилось впечатление, что жизнь там закончилась в 2013 году. Может какая катастрофа была тогда, не помню.

Ivana
() автор топика
Ответ на: комментарий от loz

Предлагаешь сделать ещё один коммон лисп? Не надо, да и не по силам будет. Да и ISLISP есть как облегченная версия CL

anonymous
()
Ответ на: комментарий от anonymous

Только тогда это не называется макросами. Просто функции. Обычные. Макрос раскрывается до выполнения _по определению_.

До выполнения формы, но это может произойти как в компайл-тайме один раз, так и в рантайме при каждом вызове формы, на усмотрение реализации. В общем лиспе, например, #. указывает что форма должна быть раскрыта строго при чтении, а не в каком-либо другом этапе.

loz ★★★★★
()
Ответ на: комментарий от anonymous

Нет, автор просил примеров что можно реализовать, по моей ссылке множество таких примеров.

Да и ISLISP есть как облегченная версия CL

Окей.. что дальше?

loz ★★★★★
()
Ответ на: комментарий от loz

Ты не понимаешь, наверное, что одному это реализовать нереально. Тупо быстрей поймешь, что это уже есть и новое аналогичное больше никому не нужно

anonymous
()
Ответ на: комментарий от anonymous

Да что нереального то? Там все разной сложности, начать можно с first-class packages, или special variables.

loz ★★★★★
()
Ответ на: комментарий от Ivana

Сделай нормальную макросистему, а потом весь свой лисп реализуй через сам же лисп. Ну и компиляцию не забудь.

turtle_bazon ★★★★★
()
Ответ на: комментарий от loz

loz, turtle_bazon - спасибо, почитаю ссылку, попробую понять что еще бывает в Лиспе. Нормальная макросистема это конечно хорошо бы. Объектная система тоже интересно, CLOS не факт что реализую, а вот простое наследование с переопределением методов честно говоря самому хотелось - в моих тестах есть пример с созданием «классов» и наследованием стула от табуретки с переопределением поля (чье-то задание на другом форуме было). Про компиляцию... Ну предварительно раскрыть все макросы в распарсенном AST перед собственно его интерпретацией я наверное смогу, то есть если компиляцией называть перевод «сырого» распарсенного как есть AST в новое AST в котором все рекурсивные макросы раскрыты до конца (кроме тех, которые специально помечены что их надо раскрывать в рантайме, насколько я понял есть спецдиректива для этого), то такую компиляцию я реализую. А если понимать получение чего-то другого, типа Хаскельного/Сишного/Ассемблерного исполняемого кода, тогда вряд ли. Да и честно говоря пока не вижу преимуществ компиляции в моем случае - скорость работы будет все равно медленная, оптимизаций типа мемоизации расчета отложенных функций или хвостовой рекурсии нет, хотя опять же, можно реализовать, но в самом начале я писал, что нет цели получить рабочий продукт на котором писать работающие программы, а просто игрушку, которая умеет много разных «фишек», хоть и небыстро. Зато есть свобода в фантазии придумывания этих «фишек», даже еще не существующих.

Ivana
() автор топика

Если их заменить на здоровые эквиваленты, то ты бросишь заниматься фигней, выучишь 1С или Java, пойдешь на высокооплачиваемую работу, найдешь себе выгодную женщину.

Это чё за выгодная женщина? Богатая чтоль?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.