LINUX.ORG.RU

Метапрограммирование и лисп

 , , , ,


1

5

Почему-то лисп весьма прочно ассоциируется с сабжем, при этом метапрограммирование тут трактуется весьма однобоко: как генерация программ, их исходников.

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

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



Последнее исправление: avtoritetniy-expert (всего исправлений: 2)
Ответ на: комментарий от avtoritetniy-expert

Я думаю, что нет. Ведь ты хочешь узнать про сабж не в сферическом лиспе в вакууме, а в каких-нибудь наиболее ходовых диалектах и реализациях, так ведь?

esandmann
()

Если мне не изменяет мой склероз, то эти новомодные фишки добавили не очень давно, лет этак 60 назад.

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

сферическом лиспе в вакууме

И в нем тоже.:)

Хорошо, щас поставлю, но я думаю, кто кодит в конкретных диалектах, если подписаны на теги, подписаны на просто «lisp», по-любому, это мало что изменит.

avtoritetniy-expert
() автор топика

Также полагайся больше на свой авторитет. Пиши побольше слов «очевидно», «я считаю». Любых несогласных шли нафиг, потому что они не гуру как ты.

Подкрепляй свои идеи кодом, как anonimous

Типа такого (взял у него):

(defun a () *lol*)
(defparameter *lol* 10)
(a) ; вернет 10
(defpaameter *lol* 100)
(a) ; вернет 100

Тебе подойдет такой код:

(defparameter *lol* 10)
(funcall (eval '(lambda () *lol*))) ; создаст лямбду в рантайме и вернет 10!

esandmann
()

наиболее мощными фишками меты

Наиболее мощная фишка метапрограммирования — вызывать срачи.

i-rinat ★★★★★
()

И внооовь начинается бой!..

unlog1c ★★★
()
Ответ на: комментарий от avtoritetniy-expert

А вообще, если бы чего-то читал, а не только писал, то в какой-то главе книги Петра Зубило ты бы нашел, что для метапрограммирования лучше брать другие языки (правда, называл ли он из - не помню)

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

Сравнил бы стиль, а не сыпал бы такими беспочвенными аргументами. Причем я ещё не совсем дурак, чтобы переписываться сам с собой

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

Ничего подобного, просто (рискну предположить) у тебя нет чувства стиля. Некоторые кидаются в «философские» вопросы, некоторые давят на то, что на лиспе «ничего не пишут», третьи сходу постят копипасту

esandmann
()

А как обстоят дела с этими, наиболее мощными фишками меты, в этих ваших лиспах?

Практически никак. Полноценная поддержка этих фишек противоречит идеям эффективной компиляции. Если хочешь полноценной меты, смотри смоллток, self, io.

anonymous
()

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

PolarFox ★★★★★
()
Ответ на: комментарий от avtoritetniy-expert

лавсан

Ололо, побольше читай всяких придурков. Хотя он-то что-то реально пишет (писал) на этом лиспе, в отличие от тебя

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

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

Это не совсем так. Это было бы так, если бы:


(define test (lambda(x) 'nothing))
(print (first test)) ; (x)

Как видим, код не эквивалентен структуре. Попытка доступа к первому элементу списка-функции вызовет ошибку. Кроме того, все что в замыканиях, недоступно ни как текст, ни как структура,

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

Зависит от диалекта. В большинстве случаев применяется какая-либо форма ескейпинга для перехода от кода к данным и наоборот.

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

А как обстоят дела с этими, наиболее мощными фишками меты, в этих ваших лиспах?

Практически никак.

Просто удивительно неверное утверждение.

Полноценная поддержка этих фишек противоречит идеям эффективной компиляции.

А лисп без компилятора не существует?

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

А лисп без компилятора не существует?

Практически нет. Маргинальные и устаревшие диалекты — не в счет.

anonymous
()

Есть три базовых вида абстракции:

  • На потоках(функциональная)
  • На состоянии(процедурная/оо)
  • Синтаксическая.

Синтаксическая абстракция - важная и, даже наверное, главнейшая часть метапрограммирования. Суть синтаксической абстракции - упрощение нотации в угоду предметной области. Во вменяемом виде она доступна только в диалектах лиспа, т.к:

  • Практически все другие языки программирования ради синтаксической абстракции заставляют нас переизобретать интерпретаторы и компиляторы(а это - невероятно сложное и нуднейшее занятие, потому кстати и малораспространенное - максимум разве что время от времени видим выродки на XML(maven'ы всякие, XAML и т.д.), плюс встраиваемый JS и всякое Lua - кривые и неудобные языки, отвратительнейше интегрирующиеся с нижележащей платформой).
  • В лиспе синтаксическая абстракция, кроме прочего, не лишает нас ни встроенных средств языка, ни возможностей комбинировать разные API построенные c использованием оной абстракции(чего не скажешь о интерпретаторах, см. выше).

Во-вторых, в CL кроме синтаксической абстракции доступны как модификация кода в рантайме, так и метаобъектный протокол. Эти два вида метапрограммирования, на самом деле, относятся ко второму вида а.(на объектах), и оба - гораздо менее мощны, чем синтаксическая абстракция.

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

всякое Lua - кривые и неудобные языки, отвратительнейше интегрирующиеся с нижележащей платформой

с какими проблемами ты столкнулся при разработке на lua?

x4DA ★★★★★
()

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

на произвольном не интересно. важна возможность работать с синтаксисом на том же самом языке.

возможности интроспекции, рефлексии и самомодификации/самогенерации в рантайме.

в правильных диалектах лиспа синтаксис имеет контекст, предоставляющий много инфы.

x4DA ★★★★★
()
Ответ на: комментарий от lovesan
  • На потоках(функциональная)

Расшифруй. Для строгого функционального языка.

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

А лисп без компилятора не существует?

Практически нет. Маргинальные и устаревшие диалекты — не в счет.

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

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

доступны как модификация кода в рантайме

Доступны, но кастрированы.

И о какой синтаксической абстракции ты лопочешь? Синтаксическая абстракция, это когда текст - first-class-object. В CL нет этого даже близко, и не будет.

Вся твоя аналитика напоминает детский лепет религиозного идиота. Разупорись уже наконец.

anonymous
()

возможности интроспекции, рефлексии

MOP.

и самомодификации/самогенерации в рантайме

«искаропки» (т.к. разработка производится тоже на уже запущенной лисп-машине).

Sectoid ★★★★★
()

это не только, и даже не столько генерация, сколько возможности интроспекции, рефлексии и самомодификации/самогенерации в рантайме. А как обстоят дела с этими, наиболее мощными фишками меты

Вроде неплохо.

В CL совсем хорошо: можно в любой момент создать/изменить/удалить тип, класс, переменную, функцию, символ, пакет.

В Racket чуть хуже: потенциально язык всё это позволяет, но по-умолчанию запрещено, так как провоцирует трудноуловимые ошибки.

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

Как видим, код не эквивалентен структуре.

Все вполне эквивалентно. Просто (eval '(lambda ...)), который лежит в test - атом, а не cons.

Попытка доступа к первому элементу списка-функции вызовет ошибку.

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

Кроме того, все что в замыканиях, недоступно ни как текст, ни как структура,

Потому что там ничего нет. Как может быть доступно то, чего нет?

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

Синтаксическая абстракция, это когда текст - first-class-object. В CL нет этого даже близко, и не будет.

Не текст, а АСТ.

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

В CL совсем хорошо: можно в любой момент создать/изменить/удалить тип, класс, переменную, функцию, символ, пакет.

Это всё хорошо при интерактивной разработке. А сколько программ ты назовешь, где это происходит при нормальном выполнении программы? Поэтому я считаю,что всё это фигня, как и выкрики «ололо, у нас код как данные».

PS. Хотя сами возможности вроде как и есть.

PPS. Поэтому такие треды говно

esandmann
()

Очередной «разрушитель мифов»?

Лучше попытайся тогда разрушить «миф», что 99,99% всех «разрушителей мифов» - тупые «неосиляторы», результат процесса полного перерождения остатков интеллекта в ЧСВ ;)

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

По меркам цивилизации, так буквально вчера. Так что катит за новость практически.

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

А вообще, если бы чего-то читал, а не только писал, то в какой-то главе книги Петра Зубило ты бы нашел, что для программирования лучше брать другие языки (правда, называл ли он из - не помню)

obvious fix

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