LINUX.ORG.RU

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

 


1

1

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


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

Ну наконец-то, уже сколько лет ждем

Особых претензий на мировое господство конечно нет

Напрасно, очевидно же что рождается эпик вин

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

Сырцы хотел скопипастить сюда, но форум пишет «слишком большое сообщение». Сейчас подумаю куда выложить и дать ссылку.

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

Я не сталкивался до этого с Лисповыми макросами, но исходя из того что я прочитал - это именно макросы, раскрывающиеся в рантайме. Вот эту ссылку http://matt.might.net/articles/metacircular-evaluation-and-first-class-run-ti... я обнаружил после того как реализовал свои, у меня что-то подобное.

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

Але, шизофреник, eval(«код с макросом») это и будут макросы в рантайме. Выпей цианид поскорее.

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

Вот ссылка на сырцы http://freetexthost.com/1cgrkhc2bh ЗЫ остальное не комментирую, но не удивлен, ибо предварительно ознакомился с нравами отдельной части местной публики.

Ivana ()

И назвали вы его Just another lisp interpreter, да? В нем есть хоть что-нибудь особенное? Вы же понимаете, что интерпретаторов лиспа очень много и ещё один просто не интересен?

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

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

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

ЗЫ кстати, очень даже не против буду реализовать в нем «что-нибудь особенное». Ради этого, собственно, и зарегистрировался здесь и читаю бред анонимусов, в надежде на конструктивные идеи/критику.

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

у меня интерес разобраться в принципах работы

Тогда надо было делать не на хацкеле а на 1С. Такого вроде еще не было

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

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

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

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

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

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


(define-macro (aif x y z) (let (it x) (if (eval x) (eval y) (eval z))))

(aif (< 2 1) (print 'foo) (print 'bar))

((lambda-macro(f x y z) (eval f x y z)) (aif (< 2 1) (print 'foo) (print 'bar)))

;>>>> barbar

Это не макросы, а fexpr'ы. Они являются first-class, так-же как и ф-ции, то есть, по сути — это обычные ф-ции, только ленивые.

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

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

ЗЫ кстати, вы не пробовали еще мой интерпретатор (банально не успели бы), а уже утверждаете что ничего интересного в нем нет :) Ну чтож, может вы уже все видели что бывает :) Например, некоторые Лисперы дивились на то, как я вызываю функции с меньшим количеством аргументов и это работает, хотя у меня нет синтаксиса объявления функций переменной арности или явной передачи необязательных аргументов и заполнение их по-умолчанию. Правда, это работало в предыдущей версии интерпретатора - с иммутабельным окружением.

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

Сырцы хотел скопипастить сюда, но форум пишет «слишком большое сообщение». Сейчас подумаю куда выложить и дать ссылку.

pastebin.com, github.com

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

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

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

Только не функции, т.к. в них нет своего окружения.

То есть, ты хочешь сказать, не лексические замыкания. Это, ортогонально понятию функция, вообще-то.

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

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

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

зарегистрировался здесь и читаю бред анонимусов

Правильнее будет так:

зарегистрировался здесь и читаю бред anonimous'а

ya-betmen ★★★★★ ()
Ответ на: комментарий от buddhist

Давай, вноси в студию определение макроса

Это идентификатор, имеющий значение +1-фазы, но связанный в 0-фазе.

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

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

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

Я хоть и дилетант (как подозреваю и многие анонимусы здесь), но отвечу что это брет собачий (да, я учусь местному стилю дискуссий). Концепция Лиспа оставляет свободу реализации когда именно раскрывать макрос, а при компиляции их раскрывают исключительно ради оптимизации и ускорения выполнения кота.

Ivana ()

Интерпретатор лиспа на хацкеле - интересный выбор.

аксимально широкий и интересный функционал

Реализуй какой-нибудь интегро-дифференциальный оператор

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

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

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

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

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

Функционал возвращает скаляр! Вы точно ничего не понимаете, а уже реализовываете функционалы!

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

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

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

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

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

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

Топ-левел форма, в которой есть макровызов.

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

«Автор, а хотите киллер-фичу? Tacit programming и ленивые вычисления в лиспе» Про первое не знаю, почитаю. Про второе - делэй/форс уже есть, через то что я называю макросами (а не особые формы), ленивые бесконечные списки на этом реализованы уже - в первом посте все написано. Но думаю куда бы еще эту концепцию засунуть.

Ivana ()

Кстати, а что это за диалект такой «Лисп» с большой буквы?

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

делэй/форс уже есть, через то что я называю макросами (а не особые формы)

Делей/форс обычно делают на лямбдах, а не через евал.

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

а как вы тогда на Хаскеле пишете? Неужели без всяких точек?

Ну кот приведен для всеобщего обозрения, можете посмотреть как.

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

Для начала, я не понимаю что значит термин функционал в системе терминов Лисперов.

Ну открываем любой словарь и видим более-менее внятное определение

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

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

Ну, судя по всему, вы там используете tacit programming тоже. А как вы его используете, не зная, что это такое?

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

Делей/форс обычно делают на лямбдах, а не через евал.

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

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

Ну, судя по всему, вы там используете tacit programming тоже. А как вы его используете, не зная, что это такое?

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

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

делей на том что я называю макросом

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

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

Будет

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

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

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