LINUX.ORG.RU

Allegro CL 9.0 Free Express Edition стал доступен для загрузки

 ,


9

10

Для загрузки на попробовать стала доступна версия коммерческой реализации языка программирования Common Lisp — Allegro CL 9.0 Express Edition.

Доступны пакеты для:

  • Linux (glibc 2.11 или позже);
  • Mac OS X (10.6 или позже), включает поддержку Lion;
  • FreeBSD (8.2 или позже);
  • Windows (XP, Vista, 7, 8, Server).

Основные новшества и изменения в этой версии:

  • полная поддержка SMP;
  • 820 исправлений и улучшений с последнего релиза;
  • полностью обновлен AllegroServe — вебсервер Franz Inc., написанный на лиспе: автоматическая компрессия/декомпрессия файлов, поддержка chunking, новый выбор опций безопасности, включая TLS v1.0 (также известный как SSL v3.1) протокол для защищенных соединений;
  • улучшена интеграция с Java через модуль jLinker, улучшен протокол, стал проще API;
  • новая и значительно упрощенная инсталляция для графических утилит на Mac 64-бит.

>>> Загрузка

★★

Проверено: anonymous_incognito ()
Последнее исправление: tazhate (всего исправлений: 4)
Ответ на: комментарий от mv

Вы, лисперы, такие смешные. Ухватились за пару success stories (чей success был, скорее всего, не благодаря лиспу, а вопреки), и газифицируете ЛОР своей тухлой пастой из года в год.

Что ваши Viaweb и поделки твоего Маркуши против всего остального IT? Каждый день включаются миллиарды компьютеров, серверов, мобильных устройств, корпоративных кластеров, хранилищ данных и числодробилок. Работают операционные системы, СУБД, сервера приложений, расчетные пакеты. Совешаются триллионы транзакций, сети передают петабайты данных, которые обрабатывают экзафлопсы железа.

И все это делается не на лиспе.

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

Это да. Но лисперов немного. Каждый может урвать свои пару лямов из всего этого великолепия, что ты описал. И никто и не заметит :)

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

Что ваши Viaweb и поделки твоего Маркуши против всего остального IT?

Давай сразу перейдём к сути: сколько миллионов долларов в кармане у каждого из того всего остального IT?

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

Давай сразу перейдём к сути: сколько миллионов долларов в кармане у каждого из того всего остального IT?

У одних только кобольщиков и АВАРщиков бабла в кармане больше, чем у всех лисперов, вместе взятых. И?

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

У одних только кобольщиков и АВАРщиков бабла в кармане больше, чем у всех лисперов, вместе взятых. И?

Indeed.com:

Cobol Developer $93,000

Average Cobol Developer salaries for job postings nationwide are 34% higher than average salaries for all job postings nationwide.

ABAP Developer $103,000 Average ABAP Developer salaries for job postings nationwide are 49% higher than average salaries for all job postings nationwide.

LISP Developer $105,000

Average LISP Developer salaries for job postings nationwide are 52% higher than average salaries for all job postings nationwide.

Ты прав, у двух среднестатистических кобольщиков и абапщиков денег больше, чем у одного лиспера ;)

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

Что не так? Зарплаты сравнимы. Только ты при этом забыл, сколько софта написано на Коболе, и сколько на лишпе. И, как следствие, сколько бабла заработано кобольщиками, а сколько лишперами.

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

Что не так? Зарплаты сравнимы.

Миф, что абапщики, и уж тем более кобольщики, получают больше лисперов, так сказать, busted.

Только ты при этом забыл, сколько софта написано на Коболе, и сколько на лишпе. И, как следствие, сколько бабла заработано кобольщиками, а сколько лишперами.

На лиспе вагоны софта написано. Я сам масштабов не осознавал, пока в омерику не понаехал и не пообщался с местным народом. Реально дофига.

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

Другой дядечка на предыдущей работе писал систему загрузки топлива в атомные реакторы в Вестингаузе.

Маркуша наш сколько на лиспе систем наворотил - два дня слушать можно. Есть, в числе прочего, и оборудование для военных.

Это всего три человека, которые работают в нашей конторе.

Работа, кстати, лисповая вполне есть, только там security clearance надо иметь, ибо они на FBI и военных работают (биометрия, аналитика).

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

бытие определяет сознание, что поделать. вышеотписавшиеся персонажи, очевидно, проживают в РФ (i.e., стране третьего мира a la индия), соответственно видят только самую низовую и черновую работу от IT — всякие бесконечные быдлоаутсорсы «на scala/clojure» с сотнями вчерашних студентов, копипастящими одни и те же баги на мегабайты исходников. вот у них и припекает, что в странах первого мира реальность иная.

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

А-та-та, аутсорс и копипастное программирование - это Китай и Индия, в основном. Лисперы запорются скорее на задачах типа рейтрейсинга, где понадобился специалист со стороны, а позвать его нельзя - он всё равно не разберётся в коде лиспера/другого лиспера.

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

аутсорс и копипастное программирование - это Китай и Индия, в основном

сходи на hh.ru что ли... может быть, доля РФ в мировых быдлокодинге и невелика, но доля быдлокодинга в РФ огромна.

он всё равно не разберётся в коде лиспера/другого лиспера

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

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

На лиспе вагоны софта написано.

Вопрос в том, когда это было....

Это всего три человека, которые работают в нашей конторе.

Очень репрезентативная выборка :)

Работа, кстати, лисповая вполне есть, только там security clearance надо иметь, ибо они на FBI и военных работают

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

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

И все это делается не на лиспе.

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

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

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

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

Это отсылка к правилу Гринспена? Так в сложные проги давно уже встраиваются готовые интерпретаторы (не Лиспа, конечно).

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

А теперь вместо лиспа подставь любой ЯП, тоже будет верно

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

а вот и ваше жирдяйшество подтянулось, хотите корма здесь? мало в руби-треде вам насували?

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

всякие бесконечные быдлоаутсорсы «на scala/clojure»

Да ты я вижу из стран нулевого мира, как глубоко в теме разбираешься! Даже в нашем селе скала-аутсорс по столбам начали клеить рядом с сайтами по $60

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

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

Далеко не в любом плохом языке есть говномакросы. Они есть только в самых мразевых и отстойных маргинальных говноязыках. Хотя, конечно же, макросам есть альтернативы. Write only код можно на том же перле без всякого макроговна писать.

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

Давай сразу перейдём к сути: сколько миллионов долларов в кармане у каждого из того всего остального IT?

60k € в год - уровень senior software developer в западной европе. Зарплата считается весьма хорошей, ещё и постараться надо на такую работу устроиться.

Миллион долларов - ну, можно и про лотерею поговорить с таким же успехом. :( Вакансий на лиспы в европе практически нет.

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

60k в год для обычного Java-кодера без понтов - нормальный, легкодостижимый уровень, причем даже в Москве, без всяких там еврожоп. А вот большинство лишперов (кроме тех, кто по основной специальности занимается мошенничеством) просто нищие. Сидят на пособии и хреначат никому не нужный код, который никто никогда даже прочитать-то и не сможет, не то что применить. Естественно, когда они узнают, сколько получают простые пацаны за Java, у них начинается анальная боль и они пишут всякий бред на ЛОР, про «миллионы» и про «секретные военные разработки». А сами доширак жрут. Так-то.

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

60k в год для обычного Java-кодера без понтов

Евро? Не звизди

причем даже в Москве
даже

Муахаха. Кого интересует этот суициадальный гетто-город наполненный крабами и маааасквичами? Шахтерам тоже приплачивают за тяжелые условия труда, знаешь ли. Java-мартышка за мкадом не сможет заработать даже на доширак, это ее истинная ценность, поэтому всеми силами держится в маааскве и гордится своим якобы «статусом», обитая в каком-то клоповнике на четверых в 40-минутах на такси от метро, знаем мы ваше серое-бездеревное-гетто. Нормальная квартира на съем стоит на меньше 2К зелени, это чтобы не чувствовать себя бомжом, но потеря ощущения нищеброда не достижима - жаба-макакам никогда не жить на рублевке и не ходить в клубы с илитными интим^W эскорт услугами, поэтому вы как самая мелочная и нищая карманом и сознанием мразь пытаетесь унизить провинциалов, хотя сами в эту мааскву позавчера из сарая выбрались. В этом ваш менталитет. Напоминающий девочку-минетчицу, которая всего конечно же «добилась сама». У нее, кстати, зачастую труд требует больше физических и даже умственных затрат.

А вот большинство лишперов (кроме тех, кто по основной специальности занимается мошенничеством) просто нищие.

Завистливый жабоминетщик во всей красе - звездобол и антилогопед

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

Рожденный ползать^W жабобыдлокодить и виртуальными отсосами у начальства в корпоративной геекультуре пролазить вверх летать^W писать на лиспе не способен. Но это всем и так давно известно.

Естественно, когда они узнают, сколько получают простые пацаны за Java

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

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

Евро? Не звизди

Евро. Не звиздю. Вакансии посмотри хотя бы, лапоть.

Кого интересует этот суициадальный гетто-город наполненный крабами и маааасквичами?

Лапоть получил в торец в Бирюлево? Это нормально. Лаптей дальше Бирюлево и не пускают. А то еще завидовать будете.

Java-мартышка за мкадом не сможет заработать даже на доширак,

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

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

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

эта макака врёт, не верьте ей.

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

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

Про РФ, по-моему, ты преувеличиваешь. вот, типичный максимум: http://www.rsdn.ru/forum/job.offers/4946491.1, куда фиг устроишься, потому, что они постят объявления только ради отчётности. Легко достижимый уровень это 2k в долларах, не евро, максимум, 3. Выше - надо быть спецом очень хорошим и места знать.

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

У маргинала-доширачника, кажется, разрыв прямой кишки. Посочувствуем ему, товарищи!

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

Это отсылка к правилу Гринспена? Так в сложные проги давно уже встраиваются готовые интерпретаторы

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

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

Java-программист может зарабатывать эти самые 60k евро где угодно

Реквестирую жабопогромистов из села кукуево, подымающих 60K евро

Евро. Не звиздю. Вакансии посмотри хотя бы, лапоть.

Подымать сравнимое бабло могут только контрактники, но контрактников не аутсорсят неССЗБ-заказчики

Лаптей дальше Бирюлево и не пускают. А то еще завидовать будете.

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

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

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

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

Реквестирую жабопогромистов из села кукуево, подымающих 60K евро

Я из дальнего подмосковья. Съел?

Подымать сравнимое бабло могут только контрактники, но контрактников не аутсорсят неССЗБ-заказчики

Организационно-правовая форма исполнителя заказа заказчика как правило абсолютно не волнует.

Вся маасква - клоака

Тут чувствуются застарелые, давно запущенные анальные нарушения. Похоже, в Бирюлево пациену не только в торец вломили, но и целостность личности анально нарушили.

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

у меня тоже самое. ЧЯДНТ?

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

Системщики пилящие ядро сложной проги вполне могут впилить туда что-то прикладное, порядком усложнив жизнь прикладникам привыкшим к готовому интерпретатору.

Ну, как бы Лисп не является ни лекарством от ошибок проектирования, ни серебряной пулей. Мало кто помнит Morris' corollary :)

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

Реквестирую жабопогромистов из села кукуево, подымающих 60K евро

Я из дальнего подмосковья. Съел?

И подымаешь 60K евро? Одмин психушечки приболел и оставил вкладку с лора не закрытой, а ты сел за комп и беснуешься? Понемаю.

Организационно-правовая форма исполнителя заказа заказчика как правило абсолютно не волнует.

Эта фраза чотко охарактеризовала тебя как некомпетентного дятла, можешь начинать сливаться

Вся маасква - клоака

Тут чувствуются

ГСМ фтреде все в машину.

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

Вакансий на лиспы в европе практически нет.

Может быть дело в том, что начиная с некоторого уровня квалификации о конкретных языках программирования вообще не говорят? Это второстепенно.

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

И подымаешь 60K евро?

Где-то в два раза больше. Беги в аптеку за свечами.

Эта фраза чотко охарактеризовала тебя как некомпетентного дятла, можешь начинать сливаться

Я в разное время работал как ИП, как ООО, тупо в черную - работодателям/заказчикам всегда было наплевать.

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

как бы Лисп не является ни лекарством от ошибок проектирования, ни серебряной пулей.

Но ИМХО лечит от такого дробления.

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

ну тогда ты п*чий ящик. иди отсюда нищеброд.

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

Удивительная история, анонимный онолитег из села подмосковно-закукуева подымает на жабе 120К евро т.е. 5 лямов рублей в год за жабобыдлокодинг.

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

Не за жабобыдлокодинг, а за решение проблем заказчиков (то есть, за знание предметной области). Ну, естественно, решение на языке Java.

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

Не за жабобыдлокодинг, а за решение проблем заказчиков

При чем здесь тогда жаба - ты занимаешься бизнесом, ларек с шаурмой в нормальном месте может приносить такие же деньги, никакой жабы знать не надо - только четко резать капусту и вертеть вертел + заносить кому нужно когда скажут. У меня знакомый батарейки в переходе продает получает > 3K зелени, но к разговору о зарплатах программистов это не имеет отношения. В нефтянке завскладом можем подымать и 10 лямов рублей в год. Короче, отдыхай

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

Удивительная история, анонимный онолитег из села подмосковно-закукуева подымает на жабе 120К евро т.е. 5 лямов рублей в год за жабобыдлокодинг.

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

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

вагоны софта написано... один наш дядечка... Другой дядечка... Маркуша наш... всего три человека

И? Я тебе могу десятерых навскидку показать, которые на РЕФАЛе обсчитывали Буран с Энергией. Что сказать-то хотел?

Миф, что абапщики, и уж тем более кобольщики, получают больше лисперов, так сказать, busted.

Как здорово придумывать самому себе мифы, а потом их развенчивать! Напоминаю, утверждение было о том, что у кобольщиков и АВАРщиков в карманах находится бабла на порядки больше, чем у лисперов. Твои «вагоны софта» - капля в море по сравнению с тем, что за всю историю человечества было написано на Коболе, Фортране и Аде.

Вообще, я это все к тому, что объем написанного кода вовсе не означает, что язык хорош, а тем более уникален. А ты ведь именно это и пытаешься доказать - но безуспешно.

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

вот у них и припекает, что в странах первого мира реальность иная.

Реальность стран 1-го мира:

13-е место в TIOBE
freelancer.com: 0 jobs
elance.com: 0 jobs
guru.com: 0 jobs
odesk.com: 0 jobs
monster.com: 2 jobs

Вывод: в странах 1-го мира лисп занимает то же место, что и в остальных. А именно - у параши.

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

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

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

Единственное преимущество (хотя и сомнительное) лиспа над другими языками - макросистема. Она в некоторых случаях позволяет быстро решать тактические задачи. Но на больших масштабах лишь превращает проект в комок запутанной и неуправляемой лисп-лапши.

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

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

Охрененный аргумент против лиспа и за жабу с крестами. Да.

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

mv, можно, пож-та, ссылку про «Маркушу»? А то из диалога непонятно.

Лол, он уже который год всем пачкает мозги этой историей. Дескать, евонный нынешний начальник, Marc Battyani, однажды за месяц якобы наклепал на лишпе некую вундервафлю, над которой до этого год (!) бились несколько жабщиков. После чего якобы положил в карман $2M и якобы каждый месяц в течение десяти лет клал в карман кругленькую сумму за поддержку.

Как только возникают конкретные вопросы - в каком году это было, какое было ТЗ, что за организация и т.п. - поциент стабильно уходит от ответа :) так что вряд ли ты чего от него дождешься, лол.

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

на больших масштабах лишь превращает проект в комок запутанной и неуправляемой лисп-лапши.

Какие ваши доказательства?

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

Вывод: в странах 1-го мира лисп занимает то же место, что и в остальных. А именно - у параши.

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

anonymous_incognito ★★★★★
()
Последнее исправление: anonymous_incognito (всего исправлений: 1)
Ответ на: комментарий от anonymous_incognito

начиная с некоторого уровня компетенции это уже не имеет значения на чём программировать

1) глупости 2) если не имеет значения, на чем, то почему предполагается, что это Лисп?

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

Посмотри в любую опенсурцную лисп-парашу (да тот же sbcl), там лапша на лапше и лапшой охаживает.

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

Какие ваши доказательства?

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

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

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

Я пока вижу ровно обратное. Проекты в которых требуется очень сложная и нетривиальная логика работы так или иначе связаны или с лиспом или с хаскелем или ещё чем-то таким. Например, системы компьютерной алгебры у которых доступен исходный код не случайно написаны на лиспе (Axiom, Maxima)

Но на больших масштабах лишь превращает проект в комок запутанной и неуправляемой лисп-лапши.

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

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

системы компьютерной алгебры у которых доступен исходный код не случайно написаны на лиспе (Axiom, Maxima)

У них очень глубокие корни - чуть ли не из 70-х, а тогда тупо не было высокоуровневых ЯП, кроме Лиспа.

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

Например, системы компьютерной алгебры у которых доступен исходный код не случайно написаны на лиспе (Axiom, Maxima)

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

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

Мощный метод. Удобный. Столько всего обосрать можно, совершенно не шаря в предмете:

Посмотри в любую опенсурцную java-парашу , там лапша на лапше и лапшой охаживает.

Посмотри в любую опенсурцную c-парашу , там лапша на лапше и лапшой охаживает.

Посмотри в любую опенсурцную python-парашу , там лапша на лапше и лапшой охаживает.

Внушает.

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

Ты совсем тупой? На Java полно чистейшего кода, по которому можно и нужно учиться. Да тот же Tomcat посмотри, хотя бы. На C лапши хватает, но есть и немало высококачественного кода. На Python парашу найти вообще очень непросто, большая часть кода отлично читается и поддерживается. А вот на говнолиспе не найдешь ни единого примера качественного кода. Любой код будет лапшой.

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

Доказательства - невостребованность LISP в промышленной разработке ПО

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

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

Может быть дело в том, что начиная с некоторого уровня квалификации о конкретных языках программирования вообще не говорят? Это второстепенно.
Может быть дело в том

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

Самому-то не смешно? Всему этому есть простое и очевидное объяснение: LISP невостребован. Вакансий нет.

начиная с некоторого уровня компетенции это уже не имеет значения на чём программировать

Феерическая чушь. Чем более зрелый специалист, тем более отчетливо он начинает осознавать, что голова не резиновая. И что лучше быть классным специалистом в своей области, нежели так-себе-специалистом во многих областях. Посмотрю я на тебя, как ты наймешь сеньора/архитектора с 10-летним стажем, или спеца по компиляторам, а потом ему такой выдашь с вертушки: а Вы у нас будете программировать микроконтроллеры на ассемблере! Дальнейшее развитие событий подсказать?

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

Ты совсем тупой?

Угу. Я тупой и ограниченный. И нет во мне такого полёта фантазии как у тебя.

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

Охрененный аргумент против лиспа и за жабу с крестами. Да.

Ты не понял. Объем написанного кода и качество языка - понятия ортогональные. Поясняю:

- На Коболе написаны тонны кода, язык кривой.
- На Java написаны тонны кода, язык хороший и прямой.
- На LISP написано мало кода, язык кривой и маргинальный.
- На Scala написано мало кода, язык отличный.

Теперь видишь? Корреляции нет.

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

И они давно уже не развиваются, потому как ушли основные разработчики.

Развиваются. Не так быстро, конечно.

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

Смотрел. Там математику надо знать не самую тривиальную, а не код разбирать.

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

Но языки, всё-таки, были. Тот же PL/1 например

Вот про PL/I не надо, я на нем программировал :)

да и Алгол процветал.

Ыыы... любители истории SE зарыдали кровавыми слезами. Во-первых, Алгол не процветал (ни один); во-вторых, Алгол-60 даже с расширениями не дотягивал даже до Паскаля, а Алгол-68 так толком и не реализовали. Так что... не было конкурентов у Лиспа.

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

Развиваются. Не так быстро, конечно.

Ну ну. Баги десятилетиями не правятся.

Смотрел. Там математику надо знать не самую тривиальную, а не код разбирать.

Какую к чертям «не самую тривиальную»? Там даже из банальной алгебры сделали лапшу.

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

Посмотрю я на тебя, как ты наймешь сеньора/архитектора с 10-летним стажем, или спеца по компиляторам, а потом ему такой выдашь с вертушки: а Вы у нас будете программировать микроконтроллеры на ассемблере! Дальнейшее развитие событий подсказать?

Ээээ... И чё? Я ещё при всём вышеотмеченном и ядро ковыряю успешно, и железки паяю, и в двигатель с АКПП непрочь залезть. ЛисперТалантливый человек - талантлив во всём.

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

Я пропустил реформу Русского языка и теперь напыщенный поток сознания, полный бездоказательных утверждений нужно называть фактами? Вот, блин.

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

Я видел весьма высококачественные (правда, узкоспециализированные) CAS, написанные вообще на Фортране. И у них, кстати, был довольно понятный код, в отличие от всяких там максим.

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

Факты - это лапша в коде на говнолишпике и красота в коде на Java. Объективные факты, между прочим.

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

Я видел весьма высококачественные (правда, узкоспециализированные) CAS, написанные вообще на Фортране

Вот именно - узкоспециализированные. А так, Фортран - Тьюринг-полный язык, да. На нем и экспертные системы писали.

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

Объем написанного кода и качество языка - понятия ортогональные.

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

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

Специалистов хантят по знаниям в определенных областях, а (любой) язычок можно осилить за пару месяцев с помощью коллег по цеху. Никто не требует от специалистов в FPGA, data mining и expert systems знания языков, только домейн + дискретку с матстатистикой. Даже по тиобе - Lisp менее популярен, чем JS на 2 позиции - это меньше, чем разница в популярности этого JS и Python. Но дебилам (вроде тебя) объяснять не проще, чем гопоте, что работа приносит больше профита в сравнении со звонкам с чужих симок - IQ degeneration в полный рост.

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

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

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

Ну, общий знаменатель у всех CAS примерно один и тот же. Узкая специализация не от того, что не могут все остальное сделать, а от того, что на фиг не надо. А так, оно и всю алгебру умело, и интегралы по теории вычетов считало (Maxima, если не ошибаюсь, этого до сих пор не умеет).

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

Самому-то не смешно? Всему этому есть простое и очевидное объяснение: LISP невостребован. Вакансий нет.

Да потому что нет вакансий писать не пойми чего, лишь бы на лиспе. Есть вакансии (обычно не в РФ) по разработке CAD-систем, экспертных систем, систем моделирования, в том числе в финансах и тд и тп. Вот среди этих и ищи лисперов.

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

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

Посмотрю я на тебя, как ты наймешь сеньора/архитектора с 10-летним стажем, или спеца по компиляторам, а потом ему такой выдашь с вертушки: а Вы у нас будете программировать микроконтроллеры на ассемблере!

Смотря в чём в 10-летнем стаже. Советую почитать книгу Питера Сейбела «Кодеры за работой, размышление о ремесле программиста», есть русский перевод https://www.ozon.ru/context/detail/id/6252312/

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

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

Ээээ... И чё? Я ещё при всём вышеотмеченном и ядро ковыряю успешно, и железки паяю, и в двигатель с АКПП непрочь залезть. Талантливый человек - талантлив во всём.

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

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

Судя по бложеку ему даже до посредственности еще очень и очень далеко. Политкорректные буржуи такой уровень называют словом wannabe.

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

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

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

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

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

Что не так?

Раньше у энтерпрайза не было выбора, был один Кобол. Язык был кривой, но без альтернатив. Результат: мегатонны legacy кода. Теперь выбор есть, да и энтерпрайз уже стал поумнее. Выбирают те языки, которые, в том числе, обеспечивают хорошую управляемость в больших проектах. Результат: LISP - в пролете.

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

если человек писал на хаскеле или лиспе долгое время

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

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

Ыыы... любители истории SE зарыдали кровавыми слезами. Во-первых, Алгол не процветал (ни один);

Так не процветал, что даже были ЭВМ у которых вместо асма входным языком являлся Алгол.

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

Какую к чертям «не самую тривиальную»? Там даже из банальной алгебры сделали лапшу.

Если так просто, где другие аналоги?

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

если человек писал на хаскеле или лиспе долгое время

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

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

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

Что не так?

В одном сообщении объём понакоденного и качество ЯП объявляются независимыми параметрами. В другом --- из одного следует другое.

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

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

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

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

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

Очень хорошо, пациент. А теперь уринотерапия.

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

Создаётся впечатление, тебя Антихрист году так в 2002 один раз призвал утопиться в собственном поносе, а ты с тех пор так успокоиться и не можешь. Отсюда же и любовь к анальной тематике.

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

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

Ололо! Сколько БОЛИ в одном треде.

Позволь мне развеять некоторые из твоих смешных стереотипов. Позволь мне также сделать это на своём примере. Мой район — одно из самых живописных мест Москвы, недалеко от Университета. Под окнами у меня парк с прудами и велодорожками, до набережной и Воробьёвых Гор рукой подать. Я живу отдельно от родителей, в трёхкомнатной квартире. Правда, чаще я живу в загородном доме или вообще за границей - я преподаю и пишу книги на английском. И да, в свободное от академической деятельности время я иногда пописываю на Java, Scala и даже Clojure. Просто чтобы быть в курсе новых течений, и чтобы мозги не закостеневали, даже не для денег (хотя лимон-другой за проект — «неплохая прибавка к пенсии»).

Так что твои суждения о Москве выдают в тебе завистливого лузера. Прозреваю замкадыша-доширачника, латентно мечтающего о понаехании в Нерезиновую, но не располагающего для этого необходимыми талантами и трудолюбием. А посему лежащего на диване, хлебающего мамкин борщ и поносящего Москву последними словами.

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

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

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

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

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

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

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

Вот сразу видно - настоящий enterprise специалист. Не то что тот, первый.

Как вы относитесь к таким менее сознательным коллегам, понтующимся на ЛОРе заученными «enterpriZe» баззвордами и порочащими твердую репутацию Java-профессионалов?

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

Во-первых, Алгол не процветал (ни один);

Так не процветал, что даже были ЭВМ у которых вместо асма входным языком являлся Алгол.

Входным языком Burroughs было _несколько_ _расширенных_ диалектов Алгол 60. И нет, существование этих машин никак не свидетельствует о процветании Алгол 60. Это всего лишь одна из многих (очень многих) тогдашних архитектур, на которой, кстати, были доступны и Фортран, и Лисп.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от mv

Соответственно, одному человеку вполне реально разбираться в нескольких несоприкасающихся областях на достаточно серьёзном уровне.

Человеку - да, не сложно. Но не лишпомакаке. Лишпомакака ни одной, даже самой узенькой области, никогда на серьезном уровне не освоит.

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

Человеку - да, не сложно. Но не лишпомакаке. Лишпомакака ни одной, даже самой узенькой области, никогда на серьезном уровне не освоит.

Скажи, от чего мне твой баттхёрт приятен? :)

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

Эталонный комментарий представителя культуры анонимусов на лоре.

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

Входным языком Burroughs было _несколько_ _расширенных_ диалектов Алгол 60. И нет, существование этих машин никак не свидетельствует о процветании Алгол 60. Это всего лишь одна из многих (очень многих) тогдашних архитектур, на которой, кстати, были доступны и Фортран, и Лисп.

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

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

Человеку - да, не сложно. Но не лишпомакаке. Лишпомакака ни одной, даже самой узенькой области, никогда на серьезном уровне не освоит.

Эпичный слив. Разделяй и властвуй.

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

я преподаю и пишу книги на английском

Уважаемый, на ваши-с труды ссылочку можно-с в уважаемых зарубежных интеллектуальных круга-с? Благодарствую-с.

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

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

Нет, речь шла о том, что Алгол далеко не «процветал» («процветание» - это Фортран и Кобол). И в любом случае, как язык реализации CAS Лисп выгрывал у _любого_ языка без встроенного типа «список» (или подобного).

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

Ты точно говоришь об Алгол60? O_o

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

Это же вроде копипаста была, не?

А я уж было поверил и хотел выбросить лишп. Ну нельзя же так шутить.

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

Это достигается за счет механизмов для построения мощных абстракций и декомпозиции.

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

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

компилятор - штука сложная

Не надо ля-ля. Ничего сложного там нет вообще. Даже оптимизации - и те все тупые.

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

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

Ну почему. В этом есть зравый смысл. Почему лисп непопулярен? Сложность? Непроизводительность? В этом что, что есть. Я хочу освоить лисп лет так 10. И везде примеры решения квадратных уравнений. Где пример создания Hello World странички с формой? Видимо a) Тот кто использует лисп считает это сверхлегким b) Тот кто использует Лисп считает это не нужным c) Тот кто использует Лисп не может этого сделать и часто призывает а и бэ.

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

А может быть, дело в том, что лисп - это секретное жидомасонское оружие, случайно вырвавшееся на свободу, и теперь его пытаются скрыть?

А что, неплохая гипотеза. Особенно если вспомнить всех тех, кто крутится вокруг да около лиспа:

автор языка - John McCarthy
авторы SICP: Hal Abelson, Gerald Jay Sussman, Julie Sussman
их учитель: Marvin Minsky
LISP-программисты и апологеты: Richard Stallman, Richard Greenblatt, Philip Greenspun, Jeffrey Mark Siskind, Bill Schelter - да тысячи их

Невольно тут начнёшь верить в ZOG :)))

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

Посмотри Clojure, если действительно интересно, форму склепаешь быстро. Он читабельнее значительно и без тяжёлого наследния прошлого.

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

Ничего сложного там нет вообще.

ты сам сколько компиляторов написал, и для каких языков?

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

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

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

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

ты сам сколько компиляторов написал,

Много

и для каких языков?

Prolog (WAM и расширения), Scheme (в C, в x86, в JVM), Pascal и разновидности (в x86, в JVM, в Forth), ну и мелочь всякую.

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

Ты точно говоришь об Алгол60? O_o

Скорее об Алгол 68

Алгол60 и Алгол68 - это _очень_ разные языки. AFAIK, полной реализации Алгол 68 не существует в природе. И в Burroughs использовался Алгол 60.

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

linux kernel - чистый C, супер энтерпрайз, больше любого джава ПО на порядки

больше любого джава ПО на порядки

Куясе.

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

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

В чем противоречие-то? Си - хороший язык, обладающий достаточными средствами для построения абстракций. Что не так?

А вот подобных LISP-проектов что-то не видно. Интересно знать, почему бы это!

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

Prolog (WAM и расширения), Scheme (в C, в x86, в JVM), Pascal и разновидности (в x86, в JVM, в Forth), ну и мелочь всякую.

ок, а теперь рекомендую попробовать написать компилятор Algol'68 или С++, и убедиться что там человеко-лет просто дохрена надо потратить, чтобы хоть чуть-чуть нормально сделать

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

Prolog (WAM и расширения), Scheme (в C, в x86, в JVM), Pascal и разновидности (в x86, в JVM, в Forth), ну и мелочь всякую.

Пруфлинки или п*здобол.

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

Scheme (в C, в x86, в JVM)

Окей, тогда скажи, почему Stalin (агрессивно оптимизирующий компилятор Scheme) занимает 33KLOC на той же Scheme? Раз там ничего сложного нет? Наверное, автор Сталина дурачёк, да?

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

Интересно знать, почему бы это

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

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

Где пример создания Hello World странички с формой? Видимо a) Тот кто использует лисп считает это сверхлегким b) Тоткто использует Лисп считает это не нужным

Вот кстати да. Оба варианта в точку.

А примеры ПриветМиров как ни странно есть в библиотеках соотвествующей html, gui и.т.п. напрвлености. И неспособность их найти и увидеть что-то говорит об уровне вопрошающего.

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

Я просто хотел показать, что высокоуровневая альтернатива лиспу существовала.

Алгол68, наверное, мог быть такой альтернативой, но компиляторов достаточно широкого его подмножества просто не существовало. Так что не было тогда альтернативы Лиспу...

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

полной реализации Алгол 68 не существует в природе.

Scala :)

Хм, Scala как Algol-68 сегодняшнего дня... что-то в этом определенно есть.

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

Кстати, там такой феерический быдлокод попадается

(define (sx-first s)
 ;; note: This can't be eta-converted because of bugs running under IRIX 5.3.
 (sx-car s))

(define (sx-second s) (sx-car (sx-cdr s)))

(define (sx-third s) (sx-car (sx-cdr (sx-cdr s))))

(define (sx-fourth s) (sx-car (sx-cdr (sx-cdr (sx-cdr s)))))

(define (sx-fifth s) (sx-car (sx-cdr (sx-cdr (sx-cdr (sx-cdr s))))))

(define (sx-sixth s) (sx-car (sx-cdr (sx-cdr (sx-cdr (sx-cdr (sx-cdr s)))))))

(define (sx-seventh s)
 (sx-car (sx-cdr (sx-cdr (sx-cdr (sx-cdr (sx-cdr (sx-cdr s))))))))

(define (sx-eighth s)
 (sx-car (sx-cdr (sx-cdr (sx-cdr (sx-cdr (sx-cdr (sx-cdr (sx-cdr s)))))))))

(define (sx-ninth s)
 (sx-car
  (sx-cdr (sx-cdr (sx-cdr (sx-cdr (sx-cdr (sx-cdr (sx-cdr (sx-cdr s))))))))))

(define (sx-tenth s)
 (sx-car
  (sx-cdr
   (sx-cdr (sx-cdr (sx-cdr (sx-cdr (sx-cdr (sx-cdr (sx-cdr (sx-cdr s)))))))))))

(define (sx-eleventh s)
 (sx-car
  (sx-cdr
   (sx-cdr
    (sx-cdr
     (sx-cdr (sx-cdr (sx-cdr (sx-cdr (sx-cdr (sx-cdr (sx-cdr s))))))))))))
 
(define (sx-twelfth s)
 (sx-car
  (sx-cdr
   (sx-cdr
    (sx-cdr
     (sx-cdr
      (sx-cdr (sx-cdr (sx-cdr (sx-cdr (sx-cdr (sx-cdr (sx-cdr s)))))))))))))
anonymous
()
Ответ на: комментарий от tailgunner

Хм, Scala как Algol-68 сегодняшнего дня... что-то в этом определенно есть.

да, только причёсанный чтобы соответствовать текущему времени, а по фичам очень похоже, не удивлюсь если вдохновение черпали именно в 68-м

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

ок, а теперь рекомендую попробовать написать компилятор Algol'68 или С++, и убедиться что там человеко-лет просто дохрена надо потратить, чтобы хоть чуть-чуть нормально сделать

Проблема тут не в том, что «компиляторы это сложно», а в том, что C++ - сам по себе большой язык, стандарт за тысячу страниц перевалил, и это просто до хрена унылого, скучного boilerplate. Алгоритмически проще, чем всякая там бухгалтерия, но так же занудно и скучно.

И от того же примитивного С, компилятор которого пишется за пару дней на коленке, C++ отличается только фронтэндом.

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

Stalin довольно косолапо написан. Да и 33kloc это не «сложно». 1Сный CRUD часто размерами намного больше бывает.

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

На пруфлинках мое имя написано, а тут я аноном. Так что гуляй, лапоть.

Или спрашивай конкретно про детали реализации, расскажу.

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

А что не так с C? Это ж не говнолисп, тут макросами злоупотреблять не принято.

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

Ну почему. В этом есть зравый смысл.

Абрам Моисеевич, вы либо трусы наденьте, либо крестик снимите.

Я хочу освоить лисп лет так 10.

Некоторые женщины так же хотят похудеть. Ну или спортом заняться, в мужском варианте. Сидят себе и хотят. Лет по десять. Вместо того чтобы поднять жопу и донести её до спортзала.

Предсказываю. Вы ещё лет двадцать будете хотеть освоить лисп и так и не осилите это сделать. Такие дела.

И везде примеры решения квадратных уравнений. Где пример создания Hello World странички с формой?

Враги ополчились на тебя и скрывают важнейшую информацию. Но, друг мой, не отчаивайтесь. Здесь, на лоре, вы найдёте психиатрическую^W помощь. Я открою вам ПРАВДУ. Дело в том, вы лучше сядте сейчас, есть такая штукак как гугль. Запустите браузер (это такая синенькая иконка с буковкой e, если не найдёте спросите у администратора), и там в адресной строке вбейте http://google.com. Появится строка, в которую можно вбивать поисковые запросы. Наслаждайтесь.

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

И от того же примитивного С, компилятор которого пишется за пару дней на коленке

Так почему же команды GCC и LLVM потратили на это годы? Наверное, там одни идиоты сидят?

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

И вообще, Схемка - это ж говнолисп, там вообще ничего сложного нет и быть не может. Вот тут рассказывают, как за 90 минут компилятор говносхемки налабать:

http://www.iro.umontreal.ca/~boucherd/mslug/meetings/20041020/90-min-scc/90-m...

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

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

Так почему же команды GCC и LLVM потратили на это годы?

И почему тот же tcc был написан за пару дней по приколу, и при этом способен компилить ядро Linux (чего даже icc не может).

Наверное, там одни идиоты сидят?

Ну, вообще-то там идиотизма очень много. Много больше, чем нужно. Все переусложнено запредельно. Но главная их проблема - поддержка 100500 разных платформ, которые еще и все время меняются, так что разработка никогда и не закончится.

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

На пруфлинках мое имя написано, а тут я аноном. Так что гуляй, лапоть.

Так и запишем, п*здобол.

Или спрашивай конкретно про детали реализации, расскажу.

Расскажи, как твой конпелятор Scheme по сравнению с теми же Stalin и Racket.

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

Кстати, кто усомнится в высокой концентрации идиотизма в LLVM, читайте InstCombine pass. Такого быдлокода даже у говнолисперов и 1Сников не найти!

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

Си - хороший язык, обладающий достаточными средствами для построения абстракций.

Завязывай с ацетоном! В цэ вообще нет абстракции, это язык для бородатых системщиков и обезьянок. Попробуй там создать реализацию связного списка, не зависящую от типа хранимых данных. Единственный способ сделать это - каст в void*. Что такое void*? Это тупо адрес ячейки памяти, прямо как в ассемблере. Т.е. для абстракций цэ предоставляет ровно те же средства, что и ассемблер.

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

если действительно интересно,

Теперь анонимус будет ещё десять лет собираться посмотреть Кложуру.

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

Расскажи, как твой конпелятор Scheme по сравнению с теми же Stalin и Racket.

Что «как»? Какие метрики?

Если спрашиваешь, какие оптимизации он делает, то Racket оптимизаций не делает вообще. Мой компилятор использует tracing jit, аналогичный по сути тому, что в v8. После разогрева по скорости не хуже Stalin, и сильно уделывает Bigloo.

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

Кстати, там такой феерический быдлокод попадается

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

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

Проблема тут не в том, что «компиляторы это сложно», а в том, что C++ - сам по себе большой язык

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

Алгоритмически проще, чем всякая там бухгалтерия

не надо так толсто троллить

И от того же примитивного С, компилятор которого пишется за пару дней на коленке

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

C++ отличается только фронтэндом.

хехе, во-первых не только, во-вторых frontend С++ - это тот ещё гемор, стандарт очень пухлый и далеко не всегда однозначный

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

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

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

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

А в джаве изначально как было? Те же void*, только называется Object, и тот же каст.

для абстракций цэ предоставляет ровно те же средства, что и ассемблер

и в каком же ассемблере реализован стек с форматом записей активации и соглашением о вызове функций?

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

Хотя бы до сотни дотянули.

До ста не удобно. Лучше до 99.

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

да, именно в этом проблема

Нет. В этом проблема переусложненных древних говноязыков. Они не нужны. C++ не нужен. Algol'68 не нужен. Common Lisp не нужен. Scala не нужна.

Нужны простые, компактные, красивые языки. Такие, как Java, Python, ECMAScript.

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

А тут-то что сложного? Scope rules во всех языках простые, как грабли. Даже в C++ их умудрились не превратить в говно.

не надо так толсто троллить

Я серьезно. TRS намного проще чем любая бухгалтерия.

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

Оптимизации тоже не сильно сложно. SSA transform - тупо, DCE, code motion - тупо.

Loop unrolling, loop strength reduction, loop invariant motion, loop fusion и все такое - тоже тупо и примитивно.

Register allocation тоже примитивно, тупых, но эффективных эвристик полно известно, особенно после SSE там все элементарно. Instruction selection тоже, тупое динамическое программирование, в бухгалтерии все намного сложнее.

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

хехе, во-первых не только,

Только, только. В clang все в один и тот же тупейший llvm ir сливается, которому, в свою очередь, до фени все проблемы C++.

во-вторых frontend С++ - это тот ещё гемор,

Исключительно за счет объема. Да и не так все страшно. В clang есть немного моего кода, как раз преимущественно в парсере и кодогенераторе C++, ничего особо сложного я там не находил.

и далеко не всегда однозначный

В таких случаях обычно делают «как в gcc, инеипет».

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

Кстати, там такой феерический быдлокод попадается

https://github.com/scala/scala/tree/master/src/library/scala, файлы Function*, Tuple* и Product*.

А как ты предлагаешь делать, чтобы было не быдлкод? В SBCL, например (https://github.com/sbcl/sbcl/blob/master/src/compiler/srctran.lisp):

;;;; list hackery

;;; Translate CxR into CAR/CDR combos.
(defun source-transform-cxr (form)
  (if (/= (length form) 2)
      (values nil t)
      (let* ((name (car form))
             (string (symbol-name
                      (etypecase name
                        (symbol name)
                        (leaf (leaf-source-name name))))))
        (do ((i (- (length string) 2) (1- i))
             (res (cadr form)
                  `(,(ecase (char string i)
                       (#\A 'car)
                       (#\D 'cdr))
                    ,res)))
            ((zerop i) res)))))

;;; Make source transforms to turn CxR forms into combinations of CAR
;;; and CDR. ANSI specifies that everything up to 4 A/D operations is
;;; defined.
(/show0 "about to set CxR source transforms")
(loop for i of-type index from 2 upto 4 do
      ;; Iterate over BUF = all names CxR where x = an I-element
      ;; string of #\A or #\D characters.
      (let ((buf (make-string (+ 2 i))))
        (setf (aref buf 0) #\C
              (aref buf (1+ i)) #\R)
        (dotimes (j (ash 2 i))
          (declare (type index j))
          (dotimes (k i)
            (declare (type index k))
            (setf (aref buf (1+ k))
                  (if (logbitp k j) #\A #\D)))
          (setf (info :function :source-transform (intern buf))
                #'source-transform-cxr))))
(/show0 "done setting CxR source transforms")

ещё не известно, что хуже ;)

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

Это не кодогенератор, это результат работы живого бредогенератора. До автоматизации столь ответственного процесса они не додумались.

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

В этом проблема переусложненных древних говноязыков. Они не нужны. C++ не нужен. Algol'68 не нужен. Common Lisp не нужен. Scala не нужна.

а ты, прости, кто такой что ты тут раскомандовался?

PS и особенно угарно что ты Scala приписал к древним языкам

shty ★★★★★
()
Последнее исправление: shty (всего исправлений: 1)
Ответ на: комментарий от anonymous

Нужны простые, компактные, красивые языки. Такие, как Java, Python, ECMAScript.

one language to satisfy all needs? ну-ну

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

А в джаве изначально как было? Те же void*, только называется Object, и тот же каст.

Я не знаю джабу. В языках, где есть абстракция, есть система типов, которая так или иначе не позволяет (на стадии компиляции или в случае доброязыка ошибкой в рантайме) сложить, например, лошади с повозками. Void* никакую информацию о типе не несёт. С сишным приведением типов ты сможешь успешно складывать флоты и инты, получая полную бессмыслицу и роняя спутники.

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

стек с форматом записей активации и соглашением о вызове функций

Привет, мы говорили о типах данных и абстракции, а не об этом.

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

Доказательств как всегда не будет.

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

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

А тут-то что сложного? Scope rules во всех языках простые, как грабли.

такие шапкозакидательства - они характеры для людей, которые не видели ничего сложнее, чем «простые, компактные, красивые языки» :)

дядьки с опытом обычно мыслят более трезво

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

компилятор - штука сложная

Ой, несложная. Если есть готовый кодогенератор, то несложная. Если синтаксис изобретаемого языка ложится на существующий парсер (или таковой можно автоматически сгенерировать по формальному описанию), то сложно удержаться, чтобы по языку на каждый чих не рожать.

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

Оптимизации тоже не сильно сложно.

ага, сильная заявка, все компиляторостроители плачут, их скоро всех поувольняют )

SSA transform - тупо, DCE, code motion - тупо. Loop unrolling, loop strength reduction, loop invariant motion, loop fusion и все такое - тоже тупо и примитивно. Register allocation тоже примитивно, тупых, но эффективных эвристик полно известно, особенно после SSE там все элементарно. Instruction selection тоже, тупое динамическое программирование,

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

в бухгалтерии все намного сложнее.

конкретно что там сложнее?

И что сильно способствует простоте - все это очень хорошо разграничивается. Все эти преобразования - сами по себе, и друг другу не мешают. Сложность между ними не распределяется. Каждое преобразование обособлено и примитивно.

а вот что не способствует простоте - допускаются только однозначные преобразования, которые не меняют смысла написанного, и вот с этим не всё так просто

Любая CRUD-система сложнее, потому как там компоненты взаимодействуют нетривиально,

конкретнее, можно?

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

в тупом компиляторе - да

shty ★★★★★
()
Последнее исправление: shty (всего исправлений: 1)
Ответ на: комментарий от anonymous

тупейший llvm ir

обоснуй

во-вторых frontend С++ - это тот ещё гемор,

Исключительно за счет объема. Да и не так все страшно.

ну ты то не одного компилятора С++ не написал - так конечно несложно, так и в космос полететь нефиг делать - зажмурился и фьють

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

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

или в случае доброязыка ошибкой в рантайме

при любом раскладе упадет.

о типах данных и абстракции

разве что от реальности.

Void* никакую информацию о типе не несёт

ну сделай void* + type info, а интерфейс в хедер. вот и будет динамическая строгая типизация.

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

Конкретный пример сложных правил приведи. Мне таких даже в плюсах не попадалось.

ну я же тебе пример привёл, в том самом сообщении на которое ты отвечаешь, и это пример из древнего классического алгола 60

PS да и вообще всяческие fortran'ы с cobol'ами - это тихий ужас, когда со стороны смотришь - да чего там, но как только влезаешь начинаешь на детские грабли напарываться

shty ★★★★★
()
Последнее исправление: shty (всего исправлений: 1)
Ответ на: комментарий от anonymous

при любом раскладе упадет.

Подучи хоть язык, который ты так защищаешь, ахо: http://ideone.com/lfb2OE

ну сделай void* + type info, а интерфейс в хедер. вот и будет динамическая строгая типизация.

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

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

выдыхай бобёр

lexer+parser — стандартные средства.

регистры, рантайм и т.д. — уже есть кодогенератор.

остаются проверки, трансформации и оптимизации над AST.

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

выдыхай бобёр

Боюсь, что на выдохе ещё один компилятор изобрету.

Ни в коем случае не выдыхай, бобёр.

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

на выдохе ещё один никому ненужный DSL изобрету и назову его компилятором

и вот вы, лисперы, все в этом

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

lexer+parser — стандартные средства.
регистры, рантайм и т.д. — уже есть кодогенератор.
остаются проверки, трансформации и оптимизации над AST.

чучелко слепить - невелика задача

shty ★★★★★
()
Последнее исправление: shty (всего исправлений: 1)
Ответ на: комментарий от anonymous

Подучи хоть язык, который ты так защищаешь, ахо

спутник упадет. от исключения в рантайме ничего не изменится.

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

будет обычный typeof.

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

чучелко слепить - невелика задача

жава или питан решают великие проблемы мироздания

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

Можно проще

(defmacro car-n (n)
  (let ((fname (intern (string-upcase (format nil "~:r" n)))))
    `(defun ,fname (s)
       (car
        ,(reduce
          (lambda (x acc)
            (declare (ignore x))
            (list 'cdr acc))
          (loop for i from 2 upto n collect i)
          :initial-value `s
          :from-end t)))))

Разворачивается в

(macroexpand-1 '(carn 12))
(DEFUN TWELFTH (S)
  (CAR (CDR (CDR (CDR (CDR (CDR (CDR (CDR (CDR (CDR (CDR (CDR S)))))))))))))
T

Использование

PARSE-ASTERISK> (twelfth (loop for i upto 12 collect i))
11
ugoday ★★★★★
()
Ответ на: комментарий от ugoday
(defmacro car-n (n)
  (let ((fname (intern (string-upcase (format nil "~:r" n)))))
    `(defun ,fname (s)
       (car
        ,(reduce
          (lambda (x acc)
            (declare (ignore x))
            (list 'cdr acc))
          (loop for i from 2 upto n collect i)
          :initial-value `s
          :from-end t)))))

говнокод. лучше так:

(defmacro car-n (n)
  (let ((fname (intern (string-upcase (format nil "~:r" n)))))
    `(defun ,fname (s)
       (car
        ,(do ((i 0 (incf i)) 
              (res 's (list 'cdr res)))
             ((= i (1- n)) res))))))
anonymous
()
Ответ на: комментарий от anonymous_incognito

Может поймёшь, о чём я, когда говорю, что профессионалу-программисту уже не очень важно на чём, на каком языке писать код.

Ну так не зря ж говорят, что бывают программисты и «программисты на»

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

Может поймёшь, о чём я, когда говорю, что профессионалу-программисту уже не очень важно на чём, на каком языке писать код.

Именно так. Но почему скобочные макаки задрачивают академические скобочные опердени в то время, пока в остальном мире проектируют большие системы и решают задачи дискретной математики?

anonymous
()
Ответ на: комментарий от ugoday
(defmacro car-n (n)
  (let ((fname (intern (string-upcase (format nil "~:r" n)))))
    `(defun ,fname (s)
       (car
        ,(reduce
          (lambda (x acc)
            (declare (ignore x))
            (list 'cdr acc))
          (loop for i from 2 upto n collect i)
          :initial-value `s
          :from-end t)))))

Эх, CL. Вот так красивее:

(defmacro car-n [n]
  (let [fname (cl-format nil "~:r" n)]
    `(defn ~(symbol fname) [~'x]
       (first  ~(reduce (fn [cons-chain _]
                          `(rest ~cons-chain))
                        'x (range n))))))

проверяем:

(pprint (macroexpand-1 '(car-n 12))) ; =>

(clojure.core/defn twelfth [x]
 (clojure.core/first
  (clojure.core/rest
   (clojure.core/rest
    (clojure.core/rest
     (clojure.core/rest
      (clojure.core/rest
       (clojure.core/rest
        (clojure.core/rest
         (clojure.core/rest
          (clojure.core/rest
           (clojure.core/rest
            (clojure.core/rest
             (clojure.core/rest x))))))))))))))

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

Нужны простые, компактные, красивые языки. Такие, как Java, Python, ECMAScript.

Охлол. Ну Пайтон ещё может быть, но остальное не подходит либо под «красивые», либо под оба критерия.

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

питон не подходит под «компактные», ну никак вообще.

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

красота в коде на Java.

как можно назвать простыни кода на несколько экранов, да ещё к тому же на языке с плохим дизайном красотой. у меня для тебя плохие новости.

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

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

Я чесно гооря не знаю, что лучше - Object или костыли.

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

С++

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

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

С++

никогда не будет реализован

как так, ведь компилятор писать - нефиг делать (шёпотом: гораздо проще, чем бухгалтерию)?

слишком плохой дизайн

что-то я здесь прям весь в смущении, даже если абстрагироваться от того, что это просто твоё мнение, как это аффектит создание компилятора?

слишком плохие доки с вечным неопределённым поведением.

bad docs is better than no docs (cheers you lisp funboys)

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

bad docs is better than no docs (cheers you lisp funboys)

У LispWorks довольно хорошая документация, насколько это возможно для динамического языка. Сравниваю с MSDN, Java Docs, Scala Docs, Haskell Docs.

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

как так, ведь компилятор писать - нефиг делать

да не сложно, я уже 3й кто тебе это говорит. А то что там плохой стандарт, то это наверное уже всем известно, стандарт состоящий на 90% из ундефинед бехавиор ненужен.

что-то я здесь прям весь в смущении, даже если абстрагироваться от того, что это просто твоё мнение, как это аффектит создание компилятора?

делаем компилятор, а не бредни старуструпа.

bad docs is better than no docs

конечно же.

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

Ну так не зря ж говорят, что бывают программисты и «программисты на»

Ну да. Есть просто маляры, а есть «кубисты», «абстракционисты».... Примерно так же отличаются ваши «программисты на всём» от «профессионалов одного языка».

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

bad docs is better than no docs (cheers you lisp funboys)

У LispWorks довольно хорошая документация

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

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

далеко не всегда однозначный

будто что-то хорошее

а кто сказал, что это что-то хорошее?

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

как так, ведь компилятор писать - нефиг делать

да не сложно, я уже 3й кто тебе это говорит.

так а в чём проблема с С++ тогда?

// вас омонимусов кто разберёт какие вы там - первые или двадцать седьмые

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

очевидно в том что я должен додумывать стандарт

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

Вот уж не думал, что матумба когда либо скажет что-либо умное! Респектище, растешь!

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

как так, ведь компилятор писать - нефиг делать (шёпотом: гораздо проще, чем бухгалтерию)?

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

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

ну я же тебе пример привёл, в том самом сообщении на которое ты отвечаешь, и это пример из древнего классического алгола 60

Херовый пример, эти правила в 3-4 строки декларативно описываются. Ты сейчас меня достанешь, придется компилятор Algol'68 писать. Делов-то...

PS да и вообще всяческие fortran'ы с cobol'ами

Не сметь на Фортран гнать. Отличный язык. Простой и красивый. Писал я, не то чтобы компилятор, но довольно таки сложные системы статического анализа кода для Fortran 77, так вот, от даже Си он отличается в лучшую сторону.

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

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

Не совсем понял, о чем ты. Но есть хороший стиль, когда функции и классы документируются, да хотя бы одной строкой текста. Это в равной степени относится и к Common Lisp (docstring), и Haskell (haddock), да и Java (javadoc) cо Scala (scaladoc). Комментарии нужны даже для себя самого, когда ты один пишешь. По-моему это как раз настоящий Ъ-стиль написания кода. Не знаю, о ком и о чем ты :)

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

Причем от лиспа нет такого ощущения перегруженности, какое есть от Scala или Си++, хотя язык по богатству возможностей не уступает ни тому, ни другому. Да и лисповый код с макросами читается легче, чем код без макросов, но зато с комбинаторами на Haskell.

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

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

так а в чём проблема с С++ тогда?

Да нет с C++ никакой проблемы. Тупо садишься, и очень аккуратно переписываешь стандарт в код. Декларативно. Без самодеятельности. С выключенным мозгом. Лучше на такую фигню не тратить время взрослого, занятого человека, а посадить едва обученную обезьянку-лаборантку.

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

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

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

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

обоснуй

Что обосновать? Тупость IR или отсуствие в нем C++-специфики?

ну ты то не одного компилятора С++ не написал

Как я уже сказал, в одном из наиболее популярных компиляторов C++ хватает моего кода. Кроме того, я когда-то на спор написал полноценный парсер C++ (поверх GLR), потратил на это меньше недели времени. Все не так страшно, как народец привык считать.

- так конечно несложно, так и в космос полететь нефиг делать - зажмурился и фьють

В космос полететь реально не сложно, уже даже школьники глубоко в стратосферу зонды запускают.

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

там же jit. как это не делает?

Там очень тупой и прямолинейный JIT, он недалеко ушел по уровню от того же LuaJIT.

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

Тупость IR.

То есть, ты будешь утверждать, что IR по уровню выше, чем C (который, в свою очередь, весьма тупой и низкоуровневый)?

То, что там SSA, что вся арифметика указателей сводится к getelementptr, что инструкций минимальное количество - это, по твоему, не делает IR тупым, крайне низкоуровневым языком? Даже C-- - и тот более высокоуровневый.

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

То есть, ты будешь утверждать, что IR по уровню выше, чем C (который, в свою очередь, весьма тупой и низкоуровневый)?

Нет. Меня интересует обоснование утверждения «в LLVM тупой IR». Можно сравнить его с нетупым IR, для наглядности.

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

Нет. Меня интересует обоснование утверждения «в LLVM тупой IR». Можно сравнить его с нетупым IR, для наглядности.

Тупой - понятние относительное. Относительно исходных языков (C и C++) он несомненно крайне тупой (и не несет в себе практически никаких следов от их особенностей, о чем собственно и был разговор).

Относительно C, который часто используется в качестве IR - тупой. Даже относительно C--, который предполагается как исключительно IR он весьма тупой.

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

Относительно C, который часто используется в качестве IR - тупой.

«Си в качестве IR» - решение вынужденное, и сравнивать любой IR с Си глупо.

Даже относительно C--, который предполагается как исключительно IR он весьма тупой.

И чем плоха эта тупость?

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

ага, сильная заявка, все компиляторостроители плачут, их скоро всех поувольняют )

Да их и так всего ничего, и сотни на весь мир не наберется.

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

Все эти оптимизации я писал своими руками. Там абсолютно ничего сложного нет. Тот же несчастный SSA transform - десять строк на Datalog-е. Loop analysis - еще 5 строк на нем же.

а вот что не способствует простоте - допускаются только однозначные преобразования, которые не меняют смысла написанного, и вот с этим не всё так просто

Все очень просто. Смотри на CompCert, там это доказывают элементарнейше.

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

Да ничем. Тупой IR - это хорошо и правильно.

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

Ты считать умеешь? Я их целых три перечислил, вообще-то.

А зачем тебе тогда нужны компиляторы других языков?

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

Так платформы новые бывают. FPGA, опять же.

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

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

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

Там очень тупой и прямолинейный JIT

Там большая часть оптимизаций делается до джита, при компиляции в байткод. Джит по сути делает только инлайнинг - собственно, какие-либо более сложные оптимизации для неигрушечного рантайма во время джит-компиляции даже теоретически невозможны. А если брать CL, то для него и инлайнинг невозможен. Так и говори, что компиляторов ты никогда в жизни не писал, сделал пару наколеночных поделок для игрушечных язычков (да и то не доделал), которые ничего сложнее факториала не в состоянии скомпилировать.

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

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

http://lambda-the-ultimate.org/node/3851#comment-57760

LuaJIT also does: constant folding, constant propagation, copy propagation, algebraic simplifications, reassociation, common-subexpression elimination, alias analysis, load-forwarding, store-forwarding, dead-store elimination, store sinking, scalar replacement of aggregates, scalar-evolution analysis, narrowing, specialization, loop inversion, dead-code elimination, reverse-linear-scan register allocation with a blended cost-model, register hinting, register renaming, memory operand fusion.

Или Lua игрушечный? Думаю, IonMonkey, V8 и PyPy делают не меньше.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от anonymous

Лол, сколько БОЛИ! Ещё, умоляю, MMMAXIMUM BUTTHURT!

Тут кто-то просил пример смеси гопника с редником, получайте.

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

Даже не смел предположить, что моя просьба будет так скоро выполнена. Благодарю Вас, сударь!

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

Matumba полезен для общества, нужный код пишет. А лисподрочеры вообще ничего нужного и полезного за всю историю не родили. Так-то.

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

А лисподрочеры вообще ничего нужного и полезного за всю историю не родили. Так-то.

Ну, почему же. С их кода и с них самих можно смачно поржать, а смех, как известно, продлевает жизнь. Стало быть, польза есть!!!111

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

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

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

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

Matumba полезен для общества, нужный код пишет. А лисподрочеры вообще ничего нужного и полезного за всю историю не родили. Так-то.

Ну, почему же. С их кода и с них самих можно смачно поржать, а смех, как известно, продлевает жизнь. Стало быть, польза есть!!!111

два лузера сидят у друг-друга посасывают. Какая прелесть!

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

Оптимизации? В байткоде? Сделайте меня развидеть это!

Ты, лошарик, хоть один jit видел? Намекну: тот же llvm умеет быть jit-ом.

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

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

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

Типичный лиспер только что ещё раз продемонстрировал свой культурный уровень. Какая прелесть!

Вот скажи мне, почему среди вас столько хамла и неадекватов? Тролль и быдлан Эрик Наггум, матерщинник «проффесор» Луговский, шизофреник-антиматематик-антисемит Золотце, неофашист ugoday? Это с вами лисп такое делает?

Или, может, лисп (как маргинальное и в некотором роде контркультурное явление) изначально притягивает к себе разного рода фриков?

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

Ещё агрессивного наркомана Лове5ана забыл.

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

Matumba полезен для общества, нужный код пишет.

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

А лисподрочеры вообще ничего нужного и полезного за всю историю не родили. Так-то.

А Лисп-кодировщиков и не существует. Для кодировщиков специальные языки придумали, не нужен им Лисп.

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

Еще упорыш Столлман и придурок в шапочке из фольги Суссман.

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

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

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

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

Еще упорыш Столлман и придурок в шапочке из фольги Суссман.

Ребе Штульман, тащемта, прикольный дядька, хоть и ебанько капитальный. А расскажи про Суссмана и шапочку? Я этой истории не слышал, но прозреваю вин

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

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

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

Про 1ce сам впервые слышу.

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

1) пишет на лиспе,
2) пишет свой лисп,
3) пишет свой язык,
4) пишет лисп-ОС,
5) конструирует лисп-машину.

Про его самодельный ололо-язычок на ЛОРе ещё Кука вбрасывал, погугли. Если хочешь, можем набижать на нульч, я тебе его покажу, он вроде до сих пор там ракует.

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

Ни у одного языка на лоре нет такой толпы хейтеров, как у лиспа.
хейтеров
хейтеров

Ты смищной. «Хейтер» — это «ненавистник», да? Как можно ненавидеть душевную болезнь? Мы же просто ловим с вас лулзы, дружок.

А вы так забавно ведётесь.

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

Блин, шикарно! А где искать поциентов пятой стадии? Такие вообще в природе встречаются?

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

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

Заврался, бедняга. Вот примерчик: http://www.2is-inc.com/

Our Customers

Defense Logistics Agency Headquarters

Defense Supply Center Richmond

Defense Supply Center Philadelphia

Defense Supply Center Columbus

US Army

US Navy

US Air Force

US Marine Corp

Major OEMs

Кого-кого, а тебя с Матубой туда точно не возьмут.

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

Блин, шикарно! А где искать поциентов пятой стадии? Такие вообще в природе встречаются?

Лично я не встречал пока, хотя если погуглить по «lisp machine FPGA», то что-то да найдётся. Ловсанчег сейчас на второй ступеньке, свой лишп пилит. Хотя, может, уже до третьей степени прогрессировал.

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

Что не так-то? Будто не знаешь, что «сапоги» наиболее консервативны, а в министерствах процветают дуболомство, откаты и распилы. В своё время была кратковременная мода на лишп. Человечество тогда практически сразу образумилось, но несколько гешефтмахеров ухитрились подсадить госструктуры на лисп-иглу, с которой и кормятся до сих пор.

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

Ухаха, нашёл кукин псто про золотцелисп, это шедевр, вот выдержка:

loadUnitHlp path t
 -> say "loadUnit $t"
 -> u:b:("$path/unit.txt".fget |> map ?.asChr.{\Newline->\Space; x->x} |> parseST
         |> map [_ a b]~>[a.asStr b.eval] |> sort by=lhd)
 -> if u."type" t=:u."type"   u."type"=:t
 -> if p:u."proto"
    then {-> keep ?,1 !u |> merge (uts.p||(loadUnit "$(path.asDirname)$p"))
          -> bdel "proto" !u}
    else u."layer" =: tileMasks.(u."layer")
 -> faces:(if f:u."faces" (do (bdel "faces" !u) f) (if u."building" 1 5))
 -> "$path/gfxes/".ls |> map (drop dataFull.len+1 ?)
    |> map x~>[(split \. x.asFilename).lhd x] |> sort by=lhd
    |> bmap (loadUnitFrames tint=srcTint faces ?)
    |> {gs -> if gs.no? gs=:u."protoGfx"  u."protoGfx"=:gs
           -> !gs."default" || [dummyFrame]
           -> for [n _] in tilesets gs.n.{no? -> gs.n=:gs."default"}
           -> u."gfxes" =: (bdel "default" gs)}
 -> (loadImage "$(drop dataFull.len+1 path)/icon.png" tint=srcTint) || uts.p."icon"
    |> {i:ye? -> u."icon" =: i}
 -> ss:[] for dir in (ls "$data/units/$t/sounds/")
      ss.(split \/ dir |> ?.rtl.rhd) =: dir.ls
 -> if ss u."sounds"=:ss
 -> [@!u "dir"=dirs,0 "frame"=0
         "mask"=(map {[c x]-> if u.c x} mcs |> fold conc |> map tileMasks.?
                 |> [0@?] |> fold or)]
 -> !u."size"   || [1 1]
 -> !u."selSize"|| u."size"*32
 -> !u."sight"  || 0
anonymous
()
Ответ на: комментарий от anonymous

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

2Is has been recognized by Inc. Magazine for three consecutive years (2009-2011) as one of America's fastest-growing, privately held, U.S.-Based Companies.

Вот бедняги, как же мучаются с этой лисп-иглой.

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

Что не так? Журнальчеги оценивают искусство гешефтмахерства. Тебе напомнить, сколько софта написано на Коболе и сколько бабла за него заплачено, при том, что Кобол - говно?

Так и с лиспом.

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

Вот это от души!

На такой ржач я даже и не рассчитывал! Побольше бы таких поциентов!

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

На такой ржач я даже и не рассчитывал! Побольше бы таких поциентов!

Я тоже поржал. Такого говна еще поискать. Спасибочки за лулзы.

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

Ну так в СШП своих Петриков навалом. А вояки всегда были для Петриков легкой наживой.

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

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

Как Кука смачно облажался.

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

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

А если Кука неправ, и тормозит оно по другой причине, то говнари-лисподрочеры облажались еще сильнее, чем можно было предположить.

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

А если Кука неправ, и тормозит оно по другой причине, то говнари-лисподрочеры облажались еще сильнее, чем можно было предположить.

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

Лучше продолжай нести бред про заговоры и авантюристов, это у тебя лучше получается.

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

Или Lua игрушечный? Думаю, IonMonkey, V8 и PyPy делают не меньше.

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

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

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

Нормальные люди так делают:

(define-syntax-rule (car-n name n)
  (define (name lst) (helper n lst)))

(define-syntax (helper stx)
  (syntax-case stx ()
    [(_ 1 lst) #`(car lst)]
    [(_ n lst) #`(helper #,(sub1 (syntax->datum #'n)) (cdr lst))]))
anonymous
()
Ответ на: комментарий от anonymous

Оптимизации? В байткоде?

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

тот же llvm умеет быть jit-ом.

И делает большинство оптимизаций на IR (что и есть байткод).

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

90% перечисленных оптимизаций спокойно делаются на байткоде, на долю джита

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

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

Не дают прироста по сравнению с чем?

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

Понятно.

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

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

Да ради бога, пусть они делаются LuaJIT. Как это опровергает тот факт, что на байткоде их делать проще и эффективнее?

Не дают прироста по сравнению с чем?

С эвристиками. RA, констант фолдинги и прочая чушь в совокупности ускорят работу вдвое-втрое максимум. Если же речь об оптимизации рантайма и кодогенерации, то тут мы говорим о росте производительности на десятичные порядки. Например, если у тебя в рантайме есть green threads, то производительность массивно использующей их программы на 99% зависит исключительно от того, как реализована работа этих green threads в рантайме. Ну а оставшийся 1% остается на всякие констант фолдинги (это не говоря уже о том что от устройства рантайма результативность и применимость таких оптимизаций существенно зависит).

Понятно.

Что понятно? Возвращаясь к green threads - что общего в оптимизации этих самых green threads в том рантайме где они есть и в том где их тупо нет? Ничего, очевидно. Или, например, в оптимизации продолжений. Или в работе TCO. Или в реализации ленивости. Или в оптимизации аллокатора гц, который для императивных и для ФП языков должен работать принципиально по-разному. Про какие-то более узкоспециализированные фишки рантайма я уже молчу. Это какой-нибудь низкоуровневый луа или там петон можно компилировать в машкод джитом, и ебашить там же оптимизации, потому что эти языки и есть по сути ассемблер, компилится все напрямую, рантайм ущербен и там нихуя нет, соответственно и оптимизировать нечего - только перекладывание байтиков.

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

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

Да ради бога, пусть они делаются LuaJIT. Как это опровергает тот факт, что на байткоде их делать проще и эффективнее?

Это опровергает утверждение:

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

даже теоретически невозможны.

Я полагаю, что ты именно тот анонимус, который это сказал.

Понятно.

Что понятно?

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

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

А мы уже говорим об оптимизации рантайма? Тогда можно поговорить и об оптимизации алгоритмов исходных программ.

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

Забавно. Примеры высокоуровневых рантаймов будут? И да, есть минимум один рантайм Python с green threads.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от anonymous

И делает большинство оптимизаций на IR (что и есть байткод).

Але, дятел, где LLVM IR, и где Racket VM? Они разного уровня. На уровне стековой машины такие оптимизации никто не делает, ибо нелепо. Для этого есть регистровые VM, со всякими там SSA, блэкджеком и лаборантками.

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

Замкадышная проктомука такая замкадышная!

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

Это опровергает утверждение:

В этом утверждении речь о том как работает _конкретный_ jit, а невозможность была указана для сложных рантаймов. Ты в пример привел питон с луа, в питоне и луа вообще tracing jit. Ты, наверное, в курсе, что основной аспект производительности tracing jit - быстрый _интерпретатор_, по-этому такой джит применяется только для очень простых языков (а питон или луа проще даже чистой r5rs scheme), чтобы обеспечить скорость интерпретации, в которую будет упирается работа джита. Тот же джаваскрипт для чистого tracing оказался чересчур сложен.

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

Ну я даже не знаю. Тот же Mike Pall, видимо, тоже относится к эзотерической компиляторной школе? Ведь если почитать некоторые обсуждения с его участием, то выяснится, что он также считает наиболее важными эвристики в работе оптимизатора, которые заточены под конкретный рантайм/ЯП и весьма ограничено применимы в какой-либо другой ситуации. Он правда обычно это высказывает в контексте работы tracing jita - а именно способа построения trace-графа, его вида и кодогенерации.

А мы уже говорим об оптимизации рантайма?

А разве мы говорили о чем-то другом? В PyPy джит, например, вообще не оптимизирует программу, он оптимизирует именно _рантайм_ (тайт-лупы самого интерпретатора). Если программа выполняется под некоторым рантаймом то по сути такого понятия как «скорость исполнения программы» не существует - есть скорость исполнения виртуальной машины/интерпретатора, в которую входит и работа сборщика, и оптимизация тех или иных фич рантайма и качество сгенерированного кода в том числе, конечно.

Забавно. Примеры высокоуровневых рантаймов будут?

Лиспы, например, или там джаваскрипт (с натяжечкой).

И да, есть минимум один рантайм Python с green threads.

И?

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

На уровне стековой машины такие оптимизации никто не делает, ибо нелепо. Для этого есть регистровые VM, со всякими там SSA, блэкджеком и лаборантками.

Единственная оптимизация, которая существенно выигрывает от SSA - это RA, это во-первых. Во-вторых, твое знание о байткоде Racket заканчивается на первых двух строчках соответствюущей статьи, иначе ты бы знал, что этот байткод хоть и является высокоуровневым, а по сути есть то же самое SSA (в байткоде нету операции присваивания значения переменной, просто нету). Ну и это представление совершенно не мешает делать constant folding/propagation, cross-module-inlining, lambda-lifting, loop unrolling и некоторые другие преобразования, которые на более низком уровне было как минимум затруднительно сделать (потому что в схеме нету циклов, вместо них хвостовая рекурсия, то есть любой алгоритм (тот же RA) имеет смысл применять только whole-program, иначе результата просто не будет).

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

Единственная оптимизация, которая существенно выигрывает от SSA - это RA, это во-первых.

Уйди отсюда, ламер.

Без SSA намного труднее делать: constant propagation, agressive DCE, invariant motion (да и вообще любой анализ на инварианты).

что этот байткод хоть и является высокоуровневым, а по сути есть то же самое SSA (в байткоде нету операции присваивания значения переменной, просто нету)

Идиот! Там есть стек - а это констрейны SSA ломает сразу и начисто. Не рассуждай о том, в чем ни черта не смыслишь, лошара.

lambda-lifting

Придурь. Lambda lifting делается задолго до генерации байткода.

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

Обратно же придурок. Про эквивалентность CPS и SSA не слышал?

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

Идиот! Там есть стек - а это констрейны SSA ломает сразу и начисто. Не рассуждай о том, в чем ни черта не смыслишь, лошара.

Нда, уебок. Если не знаешь нихуя, то молчи в тряпочку. В байткоде Racket нету никакого стека. Если бы ты, долбоеб, хотя бы раз этот байткод видел, то знал бы это. Для особо одаренных дебилов я повторю - байткод Racket имеет SSA-форму.

Придурь. Lambda lifting делается задолго до генерации байткода.

Он делается именно во время компиляции в байткод.

Обратно же придурок. Про эквивалентность CPS и SSA не слышал?

Во-первых, дебилушка, при чем тут эквивалентность CPS и SSA? Во-вторых, дебилушка, если бы ты знал не только баззворды, то был бы вкурсе, что никто на практике CPS-трансформацию при компиляции не производит. Потому что она ТОРМОЗИТ.

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

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

никто на практике CPS-трансформацию при компиляции не производит.

А можно подробнее? Такую трансформацию делает F# в Async, который на вычислительных выражениях. Еще я делаю на хаскеле, но это так экcперименты... Там просто такая трансформация естественным образом получается, если создать соответсвующую монаду (Cont и производные). Может быть, я вырвал фразу из контекста и неправильно понял?

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

Ты, наверное, в курсе, что основной аспект производительности tracing jit - быстрый _интерпретатор_

Вполне очевидно, что производительность интерпретатора важна. Про то, что она основная - впервые слышу.

Тот же Mike Pall, видимо, тоже относится к эзотерической компиляторной школе? Ведь если почитать некоторые обсуждения с его участием, то выяснится, что он также считает наиболее важными эвристики в работе оптимизатора, которые заточены под конкретный рантайм/ЯП

Не видел, чтобы он бросался фразами «даже теоретически невозможно».

Тот же джаваскрипт для чистого tracing оказался чересчур сложен.

Причины, по которым Мозилла отказалась от TraceMonkey для JS, применимы ко всем динамически типизированным языкам.

А мы уже говорим об оптимизации рантайма?

А разве мы говорили о чем-то другом?

Да. О возможностях JIT.

Примеры высокоуровневых рантаймов будут?

Лиспы, например, или там джаваскрипт (с натяжечкой).

О как. И в чем же проявляется высокоуровневость Лиспов и JS по сравнению с Питоном?

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

В байткоде Racket нету никакого стека.

У-тю-тю. Байткод racket - это expression trees. То есть, неявный стек. Эти expression trees еще надо в плоскую форму привести и регистры каждому подвыражению назначить, чтобы хоть что-то полезное с ними можно было бы делать.

Для особо одаренных дебилов я повторю - байткод Racket имеет SSA-форму.

Ты так жидко уделался, что тебя даже жалко.

Он делается именно во время компиляции в байткод.

Нет, лошара. До компиляции в байткод. Это совершенно отдельный и никак с компиляцией не связанный проход.

Во-первых, дебилушка, при чем тут эквивалентность CPS и SSA?

При том, ничтожество, что loop analysis на CPS делается точно теми же методами.

Во-вторых, дебилушка, если бы ты знал не только баззворды, то был бы вкурсе, что никто на практике CPS-трансформацию при компиляции не производит. Потому что она ТОРМОЗИТ.

Редкостной невменяемости ничтожество! Сначала CPS (смотри снова на тот же «байткод» в Racket, убожество), потом - обратно из CPS, ровно теми же методами, какими перед кодогенерацией делается переход из SSA.

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

... по шкале развития лисп-болезни... Шкала, напомню, такая:

1) пишет на лиспе, 2) пишет свой лисп, 3) пишет свой язык, 4) пишет лисп-ОС, 5) конструирует лисп-машину.

Проиграл в голос.

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

1) пишет на лиспе,

Ну да пишу, как и на Си, Erlang и Tcl, которые покрывают 99.999% моих задач. А что?

2) пишет свой лисп,

Не нужно. Есть уже мощный лисп — СL.

3) пишет свой язык,

Не нужно. Уже все есть и написано.

4) пишет лисп-ОС,

А вот этого бы не помешало. Хотеть. Но эта задача только посильна коммьюнити.

5) конструирует лисп-машину.

Тоже не помешало бы. Для встраивания было бы неплохо. Хотеть.

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

А вот этого бы не помешало. Хотеть. Но эта задача только посильна коммьюнити.

Какая ерунда. Зачем нужно коммьюнити? Коммьюнити ненужно. Ведь известно же, что один лиспер за месяц может сделать то, над чем 10 жабщиков будут безуспешно пыхтеть целый год. Про сишников я и не говорю — лиспер их уделает одним мизинцем.

Так что, может, ты просто плохо знаешь лисп? Если бы знал хорошо, давно бы уже сделал свою ОС за пару месяцев. Ведь этот язык мощнее и продуктивнее всех остальных языков, вместе взятых!!!111

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

В чём «троллинг»? Разве ты не согласен с тем, что лисп повышает производительность труда программиста на порядки (10-100 раз)?

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

Разве ты не согласен с тем, что лисп повышает производительность труда программиста на порядки (10-100 раз)?

Только, если в розовых снах зеленых.

Не на порядки, но да, повышает.

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

Только, если в розовых снах зеленых.

Но ведь mv утверждает, что его коллега за месяц сделал работу, которую за год не смогли сделать несколько Java-программистов! Пусть их было 5, это уже 60 раз. Стало быть, mv лжёт?

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

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

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

Почему не верит.

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

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

Но если лисп настолько существенно повышает продуктивность разработки, код получается гораздо более качественным, а лисперы — профессионалы с высочайшей квалификацией, то почему никто до сих пор не написал современную LISP OS для x86 и ARM?

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

История говорит, lisp os вполне были. На lisp hardware (а не C, которым x86/arm является). История же говорит, что просто море сишечных осей для x86 умерло на стадиях от эмбриона до мужчины в расцвете сил.

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

Т.е. LISP OS в принципе невозможна на x86 и ARM?

Возможна. Кто-то даже делает, я название забыл.

Почему?

Потому что «не нужно».

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

Потому что «не нужно».

Но ведь современные ОС полны архитектурных недостатков, их код огромный и раздутый, развитие заторможено из-за того, что императивный код давно превратился в лапшу. А при помощи новой современной LISP OS можно было бы избавиться разом ото всех этих недостатков!

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

Но ведь современные ОС полны архитектурных недостатков, их код огромный и раздутый, развитие заторможено из-за того, что императивный код давно превратился в лапшу. А при помощи новой современной LISP OS можно было бы избавиться разом ото всех этих недостатков!

В п...у эти операционные системы, давай лучше бухать!

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

Перестань писать на лоре.

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

У-тю-тю. Байткод racket - это expression trees.

Именно так. А expression trees без присваиваний - это SSA.

Эти expression trees еще надо в плоскую форму привести

Не надо. Они и так SSA. Зачем что-то приводить, если оно и так приведено?

Подумай, дебилушка, чем отличается (let ([x 'huy]) (let ([x x]) (pizda x))) от (x1 = 'huy, x2 = x1, pizda x)? Правильно - ничем.

Нет, лошара. До компиляции в байткод. Это совершенно отдельный и никак с компиляцией не связанный проход.

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

При том, ничтожество, что loop analysis на CPS делается точно теми же методами.

И что дальше? Еще раз для особо одаренных - никто не использует CPS-трансформацию.

Редкостной невменяемости ничтожество! Сначала CPS (смотри снова на тот же «байткод» в Racket, убожество)

Байткод Racket никакого отношения к CPS не имеет, дятел.

потом - обратно из CPS

Преобразование «обратно из CPS» не делается, дебилушка. Оно неопределено. Максимум ты сможешь оптимизировать отдельные куски, но, конечно, все равно это говно будет ТОРМОЗИТЬ.

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

Во-первых, никакого такого «перехода из SSA» не делается - просто после проведенных оптимизаций (то же RA) код уже не будет иметь SSA-формы. Во-вторых - CPS это НЕ SSA. По-этому все твои мокрые мечты к нему весьма слабо применимы. Ты начитался базвордов на википедии (про «эквивалентность», лол), но даже не знаешь, что они означают, и почему CPS считается эквивалентным SSA.

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

А можно подробнее? Такую трансформацию делает F# в Async

Речь шла о whole-program преобразовании, которое иногда используется в, например, игрушечных схемах для реализации продолжений. Но оно тормозит, как я уже сказал (т.к. код в CPS создает и передает лишнюю санку на каждый вызов), по-этому в серьезных реализациях продолжения поддерживаются на уровне рантайма. Но когда другого способа нет (типа Async в #F) - то на безрыбье и рак рыба, конечно же. Однако тут речь не идет о превращении всей программы в тормоз - преобразуются только некоторые куски (что, с другой стороны, портит совместимость этих кусков с непреобразованным кодом, но это уже совсем другой разговор).

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

Не видел, чтобы он бросался фразами «даже теоретически невозможно».

Естественно. Он ведь обычно говорит про простые языки без рантайма типа Lua. Там все возможно.

Причины, по которым Мозилла отказалась от TraceMonkey для JS, применимы ко всем динамически типизированным языкам.

Коненчо же нет. все дело было исключительно в сравнительной сложности JS.

Да. О возможностях JIT.

А что с возможностями jit?

О как. И в чем же проявляется высокоуровневость Лиспов и JS по сравнению с Питоном?

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

Про то, что она основная - впервые слышу.

Это очевидно, по-моему. tracing jit так работает, что какой бы компилированный джитом код не работал, перед этим он всегда должен быть исполнен интерпретатором (и не раз). При чем большая часть кода и скомпилирована-то никогда не будет - то есть, вообще говоря, в реальности (а не в бенчмарках) бОльшую часть рантайм проводит в режиме интерпретации. Скорострельность того же луаджита объясняется, собственно, не какими-то сверхоптимизациями джита, а тем, что там интерпретатор работает иногда быстрее чем компилированный v8 в машкод джаваскрипт.

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

А, понятно, спасибо. В F# и Haskell все ограничивается соответствующей монадой, которую еще надо запустить из «обычного» кода.

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

В п...у эти операционные системы, давай лучше бухать!

За Обаму что ли голосовал?

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

Ну они-то не написали «красиво макросом».

Так это же схемщики, они не могут в нормальные макросы из-за анальной гигиены.

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

Нужны простые, компактные, красивые языки. Такие, как Java, Python, ECMAScript.

красивые
Python

Ну кому и кобыла невеста.

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

Если бы это был кука, то писал бы из под куки.

Да он это. Кто ж еще физикам в CERNе рассказывает про UML, XML и Tomcat?

И да, кука ничем не интересен.

Как и весь этот тред.

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

Так это же схемщики, они не могут в нормальные макросы из-за анальной гигиены.

«нормальные макросы» - это когда реализация какого-нибудь примитивного loop занимает 10000 строк кода вместо 200, да еще и глючит при этом? Спасибо, не надо. Мы уж лучше как-нибудь с гигиеной - чтобы и писать меньше, и код понятнее, и работало все искаробки, без анальной акробатики.

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

«нормальные макросы» - это когда реализация какого-нибудь примитивного loop занимает 10000 строк кода вместо 200, да еще и глючит при этом?

10000000, чего уж там. И работает только по вторникам. П*деть - так по-настоящему.

и работало все искаробки

Чтобы работало только то, что есть искаробки, ты хотел сказать.

без анальной акробатики.

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

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

Да он это.

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

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

Успокойтесь, оба неправы. Говномакросы вредны и опасны в любом виде и в любой форме, хоть с гиеной, хоть без. Только очень тупые и ленивые разработчики языков предлагают пользователям макросы (чтоб за них их работу сделали) вместо того, чтобы с самого начала включить в язык все нужные конструкции, раз и навсегда.

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

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

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

Потому что «не нужно».

Браво! А теперь сделай следующий шаг и осознай, что говнолишп вообще весь не нужен.

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

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

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

Сгинь, ничтожество, тут только-только интересный техносрач пошёл.

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

10000000, чего уж там.

Ну не 10000, а сколько там? Несколько тысяч строк точно есть. Разница на порядок.

И работает только по вторникам.

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

Чтобы работало только то, что есть искаробки, ты хотел сказать.

Почему же? Т.к. гигиеническая макросистема является строгим НАДмножеством негигиенической, то все что можно сделать в негигиенической можно сделать и с гигиенической. Обратное неверно, конечно.

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

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

Другое дело, конечно, если ты пишешь примитивные макросы-однострочники (как в сишки) - именно для таких задач предназначен препроцессор общелиспа и тут он не сильно проигрывает полноценным макросистемам.

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

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

Ага, сперва включить одни инструкции раз и навсегда, потом другие инструкции раз и навсегда, потом третьи - и так до тех пор пока не получится монстр вроде си плас плас, но и тогда останавливаться не следует. Замечательный пример такого подхода хаскиль например с его бесконечными расширениями. Естественно, чтобы получить эти расширения надо ждать пока их реализуют, отладят, выпустят новую версию канпелятора (возможно с нарушением обратной совместимости). Все это вместо того, чтобы в соответствии с принципом «keep it simple» реализовать макросы и не множить сущности без необходимости.

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

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

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

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

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

Давай начинай! Время пошло! И что бы все были довольны!

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

Почему же? Т.к. гигиеническая макросистема является строгим НАДмножеством негигиенической, то все что можно сделать в негигиенической можно сделать и с гигиенической. Обратное неверно, конечно.

Приведите, пожалуйста, пример того, что можно легко сделать в гигиенической системе, но на практике очень сложно или невозможно сделать с defmacro. Почему вы считаете гигиенические системы строго более мощными? Мне очень интересен этот вопрос.

Простой вид полезных на практике макросов:

  ;;; Paul Graham, On Lisp, p191
  (defmacro aif (test-form then-form &optional else-form)
    `(let ((it ,test-form))
       (if it ,then-form ,else-form)))

Реализуйте мне такой макрос на syntax-case из R6RS. У меня проще не получилось.

Когда я размышлял на тему необходимости гигиены, то постоянно проводил параллели с системами типов. Гигиена — как статическая система типов, которая позволяет легко отлавливать простые ошибки ценой меньшей выразительности языка. Спор о том, какой тип макросистемы «фундаментальнее» подобен спору о фундаментальности статических и динамических систем типов.

Сам я не готов делать резких заявлений на эту тему, т.к. пребываю в сомнениях. Признаю, что смысл в гигиенических макросах есть, но зачастую на практике, вместо решения прикладных проблем, начинаю бороться с этим сложным для меня инструментом, а иногда даже сдаюсь и откатываюсь на define-macro в Racket. Возможно, мне просто недостаёт опыта, но гигиенические системы пока кажутся мне слишком сложным инструментом. Поэтому меня удивляет, когда люди в интернете назвают их «более фундаментальными». Мне в некоторых отношениях даже с Camlp4 проще работать, чем с syntax-case. Ключевой момент — интуитивная понятность. Возможно, что до гигиены я просто ещё не дорос.

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

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

Что значит «принципиально»?

Про реализацию гигиены поверх мощной негигиенической макросистемы:

http://www.p-cos.net/documents/hygiene.pdf

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

Браво! А теперь сделай следующий шаг и осознай, что говнолишп вообще весь не нужен.

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

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

А в чем заключалась сложность работы? Хотетелось бы определить идеальную проблемную область которую хорошо решает лисп.

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

Почему же? Т.к. гигиеническая макросистема является строгим НАДмножеством негигиенической

Макросистема CL и так эквивалентна машине Тьюринга.

Другое дело, конечно, если ты пишешь примитивные макросы-однострочники

как бы все компиляторы в части работы с AST написаны без чудо системы макротипов.

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

Хотетелось бы определить идеальную проблемную область которую хорошо решает лисп.

Компиляторы DSL.

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

проблемную область которую хорошо решает лисп

возьми любую где есть уже используют ЯП с динамической системой типов ( то есть почти любую). делай табличку - сравнение с другими используемыми там ЯП.

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

А посколько нужна она в 99% мест, тонутыпонелда - любой макрос в общелиспе превращается в неясную кучу блевотного кода, который все равно течет. Что и подтерждает упомянутый loop, да и вообще любой сложный макрос общелиспа, который на нормальную макросистему переписывается с уменьшением сорцев на порядок, при этом еще и с большей функциональностью.

Зачем писать большие и сложные макросы? Нужно создавать простые, надёжные кирпичики и комбинировать их. Если макрос простой и маленький, то сложных ошибок в нём не будет, а простые тестами выявятся. loop — очень плохой макрос (в т.ч. и интерфейс у него блевотный).

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

Почему же? Т.к. гигиеническая макросистема является строгим НАДмножеством негигиенической, то все что можно сделать в негигиенической можно сделать и с гигиенической. Обратное неверно, конечно.

Вранье. Нагенери эти самые c[a|d]*r функции гигиеническими макросами.

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

Вранье. gensym все решает.

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

Хотетелось бы определить идеальную проблемную область которую хорошо решает лисп.

Да практически любую, от хеллоуволдов до супер-сложных-систем.

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

Только вот все используемые в индустрии DSL написаны НЕ на говнолиспе. Maven там всякий, ORMы разные, регэкспы, xslt и тому подобное - нигде там говнолиспом не воняет.

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

Только вот все используемые в индустрии DSL написаны НЕ на говнолиспе. Maven там всякий, ORMы разные, регэкспы, xslt и тому подобное - нигде там говнолиспом не воняет.

там воняет жабой

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

Только вот все используемые в индустрии DSL написаны НЕ на говнолиспе. Maven там всякий, ORMы разные, регэкспы, xslt и тому подобное - нигде там говнолиспом не воняет.

Это всё DSL широкого профиля. А часто DSL имеют настолько узкую функциональность, что кроме разработчиков конкретной программы никто про них не знает. И это при том, что в софтине сотни, тысячи таких DSL. Сотня лисповских макросов — сотня языков, которые лисп позволяет комбинировать.

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

Вот за это говнолисперов и близко не подпускают к индустрии.

Вот за это лисперов и близко не подпускают к говноиндустрии.

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

Только вот все используемые в индустрии DSL написаны НЕ на говнолиспе.

Жаба-кодинг - это не индустрия. Серьезная индустрия вообще вся на самопальных говноязычках держится.

Maven там всякий, ORMы разные, регэкспы, xslt и тому подобное - нигде там говнолиспом не воняет.

Ой, а зачем это всё? Куда же делась всемогущая Джаба со всеми необходимыми инструкциями? Что не хватило инструкций? Не шмогла?

На то они и жаба-кодеры, что кроме жабы ничего не знают, очевидно же.

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

Приведите, пожалуйста, пример того, что можно легко сделать в гигиенической системе, но на практике очень сложно или невозможно сделать с defmacro. Почему вы считаете гигиенические системы строго более мощными?

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

(define-syntax-rule (defmacro (name args ...) body ...)
  (define-syntax (name stx)
    (define (helper args ...) body ...)
    (syntax-case stx ()
      [(_ args ...) (datum->syntax stx (apply helper (syntax->datum #'(args ...))))])))
И вот у нас есть обычный негигиенический defmacro. Теперь попытаетмся написать при помощи defmacro define-syntax - и у нас ничего не выйдет. Потому чот defmacro в общелиспе оперирует списками, а define-syntax - синтаксическими объекитами, которые содержат информацию о лексическом контексте, биндингах, source location и т.д., другими словами, чтобы сделать define-syntax нам надо полностью переписать экспандер, то есть переделать макросистему.

Простой вид полезных на практике макросов:

Вот это кстати замечательный пример. На defmacro нельзя написать анафорические макросы - тот же aif. С гигиеной у нас все просто, тупо пишем:

(define-simple-macro (aif test-form then-form else-form)
  #:with it (syntax-local-introduce #'it)
  (let ([it test-form])
    (if it then-form else-form)))
и вот у нас работающий гигиенический макрос. без гиигены возникают проблемы - макрос-то вроде написан, но его нельзя использовать при написании других макросов! то есть в моей гигиенической реализации я могу написать вот такой макрос:
(define-syntax-rule (yoba x)
  (aif (+ x 1) x it))
а в твоей общелисповой уже не могу. почему? а ответ простой. Допустим, некто решил использовать мой макрос yoba. Естественно, он не знает и знать не должен, какова реализация и как yoba раскрывается. В частности, он не знает (и знать не должен) что там используется aif и it. И тут этот человек использует нечто вроде:
(let ([it 3]) (yoba it))
ну или же еще более смешной вариант, он использует тот самый aif и в нем yoba:
(aif 3 (yoba it) 0)
т.к. человек применявший yoba ни в первом ни во втором случае не знает экспанда этого макроса он не ожидает, ожидать не может и ожидать не должен, что этот макрос чего-то там перекроет. А значит, он полагает, что (display it) выведет 3 (ведь именно таково, по его мнению, значение it). В гигиенической реализации именно так и происходит, а вот в общелиспе не тут-то было! И в общелиспе эта проблема нерешаема. По-этому полноценные анафорические макросы в общелиспе не напишешь - гигиены нет. Для анафорических макросов обязательна гигиена.

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

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

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

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

Что значит «принципиально»?

Ну значит никак нельзя, невозможно.

Про реализацию гигиены поверх мощной негигиенической макросистемы:

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

(define-syntax-rule (yoba x y) 
  (+ x y))

(let ([+ -])
  (yoba 1 1))
с гигиеной результат будет 2, без гигиены - 0. Для решения этой проблемы в коммон лиспе нагородили кучу всего - от пекеджей до lisp-2, но даже в комплексе эти средства проблему не решают, а лишь пытаются замести ее под ковер.

Грубо говоря, гигиена - это инструмент, который позволяет макрописателю управлять лексическими связываниями используемых в макросе идентификаторов (в частности макрописатель может предоставить управление и пользователю макроса). С гигиеной это управление возможно - без гигиены нет. Именно поэтому гигиенические системы - это строго НАДмножество, а негигиенические - всего лишь их частный случай.

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

Макросистема CL и так эквивалентна машине Тьюринга.

«макросистема» плюсов тоже эквивалентна машине Тьюринга.

как бы все компиляторы в части работы с AST написаны без чудо системы макротипов.

Что еще за чудо-система макротипов и при чем тут работа компиляторов в части АСТ? Смысл макросистемы как раз именно в том и состоит, чтобы вместо написания компилятора или его части реиспользовать уже существующие части языкового рантайма.

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

Зачем писать большие и сложные макросы? Нужно создавать простые, надёжные кирпичики и комбинировать их

Естественно, подразумевается, что у нас не один единственный макрос, в котором полотнища кода, а целая библиотека макросов, тот самый единственный макрос может выступать в роли, возможно, интерфейса. Собственно, гигиена именно и предназначена для того, чтобы увеличить композабельность макросов и снять с программиста бОльшую часть забот (на самом деле один большой простынный макрос написать проще чем несколько эквивалентных взаимодействующих «кирпичиков»). Надо отметить, что даже в случае гигиены, которая берет на себя почти всю работу, контроль за взаимодействием макросов иногда весьма сложен. Без гигены задача неподъемна даже в простейших случаях.

loop — очень плохой макрос

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

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

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

Я подожду, когда они proposal выкатят.

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

А в чем заключалась сложность работы? Хотетелось бы определить идеальную проблемную область которую хорошо решает лисп.

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

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

Хотетелось бы определить идеальную проблемную область которую хорошо решает лисп.

Используй поиск по форуму.

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

ну или же еще более смешной вариант, он использует тот самый aif и в нем yoba: (aif 3 (yoba it) 0)

Развернётся в let ... if, в котором для вычисления it будет использоваться предыдущий биндинг it.

В общелиспе часто используются if-let, где биндинги поимённые создаются.

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

Спасибо за интересный ответ.

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

(define-syntax-rule (defmacro (name args ...) body ...) (define-syntax (name stx) (define (helper args ...) body ...) (syntax-case stx () [(_ args ...) (datum->syntax stx (apply helper (syntax->datum #'(args ...))))])))

И вот у нас есть обычный негигиенический defmacro. Теперь попытаетмся написать при помощи defmacro define-syntax - и у нас ничего не выйдет. Потому чот defmacro в общелиспе оперирует списками, а define-syntax - синтаксическими объекитами, которые содержат информацию о лексическом контексте, биндингах, source location и т.д., другими словами, чтобы сделать define-syntax нам надо полностью переписать экспандер, то есть переделать макросистему.

Согласен, defmacro тривиально реализуется поверх syntax-case.

Согласен также, что syntax-case реализуется поверх defmacro только путём написания своего макроэкспандера. Не уверен, насколько это сложно (нужно будет пропихивать лексический контекст в каждый макрос). Возможно, что это не очень сложно (скажем, 1000 строк и неделька работы), но да, намного сложнее реализации defmacro поверх syntax-case.

Я понял ваш критерий. Просто и понятно.

Попробуем зайти с другой стороны: представьте, что вы пишете компилятор лиспа. Нет ещё никакой гигиены, нет никакого defmacro. Что вначале реализуете — defmacro, а поверх гигиену, или сначала гигиену (уже сложнее, т.к. у нас нет даже самых тупых макросов), а потом уже defmacro в 5 строк?

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

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

Потому чот defmacro в общелиспе оперирует списками, а define-syntax - синтаксическими объекитами, которые содержат информацию о лексическом контексте, биндингах, source location и т.д.,

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

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

Вранье. Нагенери эти самые c[a|d]*r функции гигиеническими макросами.

(define-simple-macro (helper path ...)
  #:do [(define p (for/list ([x (syntax->datum #'(path ...))])
                    (case x [(car) #\a] [(cdr) #\d])))] 
  #:with name (syntax-local-introduce (datum->syntax #'this (string->symbol (list->string `(#\c ,@p #\r)))))
  (define (name lst) (helper2 (path ...) lst)))

(define-syntax (helper2 stx)
  (syntax-parse stx
    [(_ () lst) #'lst]
    [(_ (f ... l) lst) #'(helper2 (f ...) (l lst))]))

(begin-for-syntax
  (define-simple-macro (paths lst ...)
    #:with (id ...) (generate-temporaries #'(lst ...)) 
    (for*/list ([id lst] ...) (list id ...))))

(define-simple-macro (gen)
  #:do [(define p (list #'car #'cdr))]
  #:with (((car-cdr ...) ...) ...) (list (paths p p) (paths p p p) (paths p p p p))
  (begin (helper car-cdr ...) ... ...))

Вранье. gensym все решает.

При чем тут генсим? 99% мест где нужна гигиена генсимом не покрываются. (define-syntax-rule (yoba x y) (+ x y)) - давай попробуй с генсимом гарантировать, что никто не переопределит + в области вызовы yoba.

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

Вот это кстати замечательный пример. На defmacro нельзя написать анафорические макросы - тот же aif. С гигиеной у нас все просто, тупо пишем:

Не совсем тупо. Нужно знать про всякие syntax-local-introduce и ворох других трансформеров. А с defmacro нужно знать только про цитирования и антицитирования, ну и уметь обходить опасные случаи при помощи всяких gensym.

Но пример хороший. У меня какой-то совсем сложный aif получился, даже показывать не хочу :-) Это из-за недостатка опыта.

т.к. человек применявший yoba ни в первом ни во втором случае не знает экспанда этого макроса он не ожидает, ожидать не может и ожидать не должен, что этот макрос чего-то там перекроет. А значит, он полагает, что (display it) выведет 3 (ведь именно таково, по его мнению, значение it). В гигиенической реализации именно так и происходит, а вот в общелиспе не тут-то было! И в общелиспе эта проблема нерешаема. По-этому полноценные анафорические макросы в общелиспе не напишешь - гигиены нет. Для анафорических макросов обязательна гигиена.

Ясно. Гигиена такого рода позволяет обеспечить модульность, без которой сильно усложняется комбинация dsl. В Racket это хорошо демонстрируется. Но меня интересует — во всех ли случаях имеет смысл использовать гигиену? Мне сложно работать с ней, думать больно много приходится. А хочется быстро и грязно и рука сама тянется к defmacro, возможностей которого во многих случаях хватает (хотя, конечно, на грабли наступать приходилось).

mrm
()
Ответ на: комментарий от anonymous
(define-simple-macro (helper path ...)
  #:do [(define p (for/list ([x (syntax->datum #'(path ...))])
                    (case x [(car) #\a] [(cdr) #\d])))] 
  #:with name (syntax-local-introduce (datum->syntax #'this (string->symbol (list->string `(#\c ,@p #\r)))))
  (define (name lst) (helper2 (path ...) lst)))

(define-syntax (helper2 stx)
  (syntax-parse stx
    [(_ () lst) #'lst]
    [(_ (f ... l) lst) #'(helper2 (f ...) (l lst))]))

(begin-for-syntax
  (define-simple-macro (paths lst ...)
    #:with (id ...) (generate-temporaries #'(lst ...)) 
    (for*/list ([id lst] ...) (list id ...))))

(define-simple-macro (gen)
  #:do [(define p (list #'car #'cdr))]
  #:with (((car-cdr ...) ...) ...) (list (paths p p) (paths p p p) (paths p p p p))
  (begin (helper car-cdr ...) ... ...))

сравниваем с:

(defmacro car-n (n)
  (let ((fname (intern (string-upcase (format nil "~:r" n)))))
    `(defun ,fname (s)
       (car
        ,(do ((i 0 (incf i)) 
              (res 's (list 'cdr res)))
             ((= i (1- n)) res))))))

даже не знаю что тут говорить, хуже гигены в лиспе только хаскель.

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

А можно привести пример использования лексического контекста, биндингов и source location в гигиеничесом макросе?

Ну просто пример использования source location:

(define-syntax-rule (yoba error-expression) error-expression)
(yoba (+ 1 "1"))
в данном случае ошибка в выражении "(+ 1 «1»)" - Dr.Racket кинет эксепшн, выделит этот кусок выражения няшной розовой рамочкой в тексте исходного файла и укажет его позицию (2 строка, 7 символ). Эта информация, в частности, используется в дебагере - когда выполняете код, то дебагер прыгает на исполняемое выражение и выделяет его. Оно же используется для вывода значений переменных, если мышкой навести. Ну и вообще эта информация нужна для отладки и корректного вывода ошибок.

Ну или хотя бы объяснить, что в макросе понимается под лексическим контекстом, откуда на стадии макроэскандинга взялись биндинги

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

и что делать с source location, если в следующей форме есть макрос, который этот самый source перекроит?

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

(define-syntax-rule (yoba x y)
  (begin (+ x y)))

(yoba 1 "2")
в этом случае ошибка в выражении "(+ x y)" и именно его и подсветит, то есть именно в самом определении макроса а не в точке вызова. Нам это неудобно, следуя логике ошибка в этом выражении это по сути ошибка в выражении всего макроса, так что было бы естественным подсвечивать и указывать позицию выражения "(yoba 1 «2»)", поэтому мы можем в макросе поменять позицию выражения "(+ x y)" на позицию выражения "(yoba 1 «2»)".

откуда на стадии макроэскандинга взялись биндинги (информация из рантайма, в общем-то)

Ну потому что это информация из компайлтайма, точнее из первой фазы :)

(рантайма/компайлтайма нет - есть фазы, при чем они относительные. 0 - текущая, есть -1, 2, -2, 2 и так далее до +- бесконечностей).

Благодаря этому можно сравнивать идентификаторы по их биндингу и в частности реализовать нормальный макростепер - в нем все связанные переменные красивенько подсвечиваются и т.п. вдобавок любой синтакс. объект хранит весь свой «путь» (через какие макросы проходил) это позволяет при отладке макросов скрывать те или иные группы макросов, раскрывая остальные. Еще синтакс. объекты могут хранить произвольные свойства.

То есть вообще, если экспандер видит несвязанную переменную, он дает ошибку «unbound variable». Отсюда следует, что рекурсивные определения невозможны, но на самом деле они возможны благодаря тому, что экспандер в некотором смысле двухпроходной. Что очень сильно повышает выразительность макросистемы, кстати, позволяя произвольные forward-declarations, то есть можно вызывать макрос, который не определен в точке вызова, но определен где-то там ниже. С макросами это не так важно, а вот если мы хотим связать раскрытие макроса с произвольной статической информацией (например как match связан с объявлениями struct), то очень полезно.

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

Развернётся в let ... if, в котором для вычисления it будет использоваться предыдущий биндинг it.

Для вычисления. А для подстановки будет использован новый it. Там внутри будет выражение (if it it it) причем первый и третий it - это «новые» и тут все логично, т.к. они вводятся макросом, а вот второй it, который будет выведен результатом, введен макропользователем, который не ожидал переопределения и ожидал возврата 3, в то время как общелисп вернет 4.

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

anonymous
()
Ответ на: комментарий от anonymous
(define-simple-macro (helper path ...)
  #:do [(define p (for/list ([x (syntax->datum #'(path ...))])
                    (case x [(car) #\a] [(cdr) #\d])))] 
  #:with name (syntax-local-introduce (datum->syntax #'this (string->symbol (list->string `(#\c ,@p #\r)))))
  (define (name lst) (helper2 (path ...) lst)))

(define-syntax (helper2 stx)
  (syntax-parse stx
    [(_ () lst) #'lst]
    [(_ (f ... l) lst) #'(helper2 (f ...) (l lst))]))

(begin-for-syntax
  (define-simple-macro (paths lst ...)
    #:with (id ...) (generate-temporaries #'(lst ...)) 
    (for*/list ([id lst] ...) (list id ...))))

(define-simple-macro (gen)
  #:do [(define p (list #'car #'cdr))]
  #:with (((car-cdr ...) ...) ...) (list (paths p p) (paths p p p) (paths p p p p))
  (begin (helper car-cdr ...) ... ...))

Очень сложно. Слишком много деталей. Леса за деревьями не видно. Другой анонимус привёл простой пример реализации на тупом defmacro, который _на практике_ скорее всего (никаких, конечно, гарантий) будет нормально работать.

При чем тут генсим? 99% мест где нужна гигиена генсимом не покрываются. (define-syntax-rule (yoba x y) (+ x y)) - давай попробуй с генсимом гарантировать, что никто не переопределит + в области вызовы yoba.

Я бы и не пытался ничего гарантировать. Простые косяки, от которых защищает гигиена, и так на тестах вылезут. Я всё-таки не софт для атомных реакторов пишу и мне кажется, что гигиенические макросы — такая же стрельба из пушки по воробьям, как и использование Coq вместо какого-нибудь ML.

Но, вообще, у меня нет богатого опыта использования сложных макросов. Мои use-case, скорее всего, намного проще ваших. Лисп — не один из моих основных рабочих инструментов. Я только к нему присматриваюсь, т.к. задумываюсь о макросах лиспа каждый раз, как начинаю лепить очередное монстроподобное поделие на функторах и довольно сложном в использовании препроцессоре в OCaml :-)

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

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

Вы немного не поняли суть. Гигиену нельзя построить «поверх тупых макросов». Придется просто взять и выкинуть старый экспандер с изрядным куском рантайма, после чего практически с нуля написать новый. То есть попытка предварительной реализации defmacro не имеет смысла как таковая.

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

а в твоей общелисповой уже не могу

в этом случае легко можно, если yoba нормально написан:

(defmacro yoba (x)
  (let ((val-1 (gensym)))
    `(let ((,val-1 ,x))
       (aif (+ ,val-1 1) ,val-1 it))))
anonymous
()
Ответ на: комментарий от anonymous

Вы немного не поняли суть. Гигиену нельзя построить «поверх тупых макросов». Придется просто взять и выкинуть старый экспандер с изрядным куском рантайма, после чего практически с нуля написать новый. То есть попытка предварительной реализации defmacro не имеет смысла как таковая.

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

Я просто рассуждаю вслух, не принимайте близко к сердцу :-) Мне интересно, в чём проблемы такого подхода.

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

Очень сложно. Слишком много деталей.

Каких деталей? Реализация изрядно проще чем вариант на общелиспе.

Другой анонимус привёл простой пример реализации на тупом defmacro

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

Собственно давайте ближе к сути, там макрос состоит из двух частей - генерация всех возможных комбинаций car/cdr и генерация дефайна из каждой из них. Первая часть задачи занимает 1/2 всего макроса, при чем эта часть задачи от макросистемы не зависит, ее можно реализовать и так и эдак (то есть мой вариант можно перевести на общелисп, а варинат общелиспа на Racket). Вторая часть задачи генерит дефайн - и эта часть тоже может полностью совпадать, единственная разница лишь в том, что в моем варианте к сгенерированному символу для имени функции надо применить syntax-local-introduce/datum->syntax. Это (применение функции) ЕДИНСТВЕННАЯ разница, которая обязана быть, все остальное можно сделать как в реализации для SBCL. Другое дело что в общемакросах принято (и все привыкли) пидорасить списки на низком уровне, а в racket идеоматический путь - делать все на паттернах. Хотя можно и руками, но принято на паттернах. Потому что декларативно и ясно - глянув на паттерн сразу видно какая у макроса форма вызова и куда он раскрывается (если посмотерть на тело). А когда там петушня типа `(blah blah ,@(do blah-blah)), то пока вы не отпарсите и не поймете как и что происходит в do, то и результат работы макроса не ясен.

Я бы и не пытался ничего гарантировать. Простые косяки, от которых защищает гигиена, и так на тестах вылезут.

В том и дело что не вылезут. Такие вещи как вариант с aif или с переопределением плюса можно будет словить только очень-очень поздно, причем скорее всего это все будет в macro-generated коде и вы будете долго и нудно изучать выблев экспандера. Это как раз значительный плюс гигиены - с ней макрос либо вообще никак не раскрывается, либо работает правильно.

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

Но пример хороший. У меня какой-то совсем сложный aif получился, даже показывать не хочу :-) Это из-за недостатка опыта.

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

Не совсем тупо. Нужно знать про всякие syntax-local-introduce и ворох других трансформеров.

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

Но меня интересует — во всех ли случаях имеет смысл использовать гигиену?

Вопрос немного некорректен. По сути гигиену нужно использовать _всегда_, и только _в некоторых редких случаях_ надо ее обходить. Именно по-этому гигиена работает по умолчанию. Если бы дело было наоборот (то есть в некоторых редких случаях гигиена нужна а в основном без нее) то тогда по умолчанию гигиены не было бы но ее можно было бы вводить.

Мне сложно работать с ней, думать больно много приходится.

Она нужна именно за тем чтобы не думать :)

Можно привести несколько случаев, когда вам надо было обходить гигиену? Возможно, я смогу привести пару идеоматических решений, которые снимут подобные проблемы :)

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

в этом случае легко можно, если yoba нормально написан:

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

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

Нет ещё никакого сложного гигиенического экспандера

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

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

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

Ты не то сравниваешь. Вот вариант на общелиспе:

;;;; list hackery

;;; Translate CxR into CAR/CDR combos.
(defun source-transform-cxr (form)
  (if (/= (length form) 2)
      (values nil t)
      (let* ((name (car form))
             (string (symbol-name
                      (etypecase name
                        (symbol name)
                        (leaf (leaf-source-name name))))))
        (do ((i (- (length string) 2) (1- i))
             (res (cadr form)
                  `(,(ecase (char string i)
                       (#\A 'car)
                       (#\D 'cdr))
                    ,res)))
            ((zerop i) res)))))

;;; Make source transforms to turn CxR forms into combinations of CAR
;;; and CDR. ANSI specifies that everything up to 4 A/D operations is
;;; defined.
(/show0 "about to set CxR source transforms")
(loop for i of-type index from 2 upto 4 do
      ;; Iterate over BUF = all names CxR where x = an I-element
      ;; string of #\A or #\D characters.
      (let ((buf (make-string (+ 2 i))))
        (setf (aref buf 0) #\C
              (aref buf (1+ i)) #\R)
        (dotimes (j (ash 2 i))
          (declare (type index j))
          (dotimes (k i)
            (declare (type index k))
            (setf (aref buf (1+ k))
                  (if (logbitp k j) #\A #\D)))
          (setf (info :function :source-transform (intern buf))
                #'source-transform-cxr))))
(/show0 "done setting CxR source transforms")
а то что ты написал будет так:
(define-simple-macro (car-n n name)
  #:with name (syntax-local-introduce (format nil "~:r" (syntax->datum #'n)))
  #:with form (for/fold ([res #'lst]) ([i (sub1 (syntax->datum #'n))])
                #`(cdr #,res))
  (define (name lst) (car form)))

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

Насколько я понимаю того анонима, вместо решения с gensymом гигиена хочет это делать автоматом

При чем тут генсим-то? Гигиена никак не связана с генсимом.

А в CL, например, можно обернуть defun макросом с реализацией передачи контекста. И всё будет работать, а приписывать реализацию не нужно.

Нет, не будет. и реализацию придется переписать :(

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

По какому однострочнику? Что не работает? Снятие гигиены с символа делается простым применением syntax-local-introduce. Все. Больше ничего не надо.

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

Сначала реализуем тупой defmacro, т.к. это полезный инструмент, нам с помощью него нам проще будет реализовать сложный экспандер с гигиеной. А в какой-то момент мы сможем выкинуть этот defmacro из ядра и забустрапить всё на гигиеничном экспандере.

А, ну в плане бустрапа, конечно, можно. Я просто не думаю, что defmacro при бустрапе будет сильно полезным инструментом, который ощутимо поможет в реализации фаз и онадизмов :)

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

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

Да ты и так всё переусложнил. Либо используем gensym( хоть там внутри aif, let и т.д.), либо объявляем частью интерфейса. В CL все просто и понятно, в отличии от.

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

либо объявляем частью интерфейса

частью какого интерфейса?

Да ты и так всё переусложнил.

Посмотри на мою реализацию yoba и на свою реализацию yoba. У кого она сложнее, лол? И это еще простенький случай, тем сложнее макрос - тем больше будет выигрыш в случае гигиены. Вплоть до того момента, когда на общелиспе вообще не получится написать нормальное решение.

Либо используем gensym( хоть там внутри aif, let и т.д.)

Ну попробуй использовать генсим внутри aif.

В CL все просто и понятно

Оставит тот момент, что в CL ничего не работает. Чем реализация CL «проще и понятнее»?

Ах, да, уже придумал как мне гарантировать, что во внешнем контексте не перекроют плюс и он не станет минусом?

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

При чем тут генсим-то? Гигиена никак не связана с генсимом.

Hygienic macros are macros whose expansion is guaranteed not to cause the accidental capture of identifiers

Просто схема - это LISP-1, и без гигиены варианты с gensym нормально работать не будут.

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

LISP-1 и LISP-2 никак не связаны с гигиеной. Варианты с генсим работать не будут нигде - ни в схеме ни в общелиспе (то есть в схеме они и без генсимов будут работать). Опровергнуть мои слова можно элементарно - всего лишь привести рабочий пример на общелиспе (то есть такой, который не будет падать, если кто-то переопределит внешний контекст).

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

И, да, вопрос. Зачем в каждом макросе писать кучу генсимов, если можно делать это автоматически, гигиеной?

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

Ты не то сравниваешь.

в любом случае будет меньше кода чем в схеме.

Вот вариант на общелиспе

Это низкоуровневая реализация.

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

в любом случае будет меньше кода чем в схеме.

Ага. Ровно на вызов syntax-local-introduce. Я привел реализация на ракетке.

Это низкоуровневая реализация.

Это реализация вообще другого макроса.

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

Это реализация вообще другого макроса.

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

а алгоритм примитивный. генерируем строчки вида «cadr» и списки вида `(cdr (car ,value)). первое - имя функции, второе - тело, value - аргумент.

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

Зачем в каждом макросе писать кучу генсимов

в лисп-2 на порядок меньше, в лисп-1, наверное, никак. а как гигиена справляется с количеством вычислений форм с сайд эффектами?

anonymous
()
Ответ на: комментарий от anonymous
(define-syntax-rule (yoba x y) 
  (+ x y))

(let ([+ -])
  (yoba 1 1))

с гигиеной результат будет 2, без гигиены - 0.

Так ты испортил макрос. Торчащий наружу + - это такая же анафора, как и it. Макрос означает «применить то, что в месте вызова называется сложением». А у тебя гигиенка эту анафору испортила.

anonymous
()
Ответ на: комментарий от anonymous
(defmacro aif (test-form then-form &optional else-form)
  (let ((itt (gensym)))
    `(let ((,itt ,test-form))
       (symbol-macrolet ((it ,itt))
	 (if ,itt ,then-form ,else-form)))))

(defmacro yoba (x)
  `(aif (+ ,x 1)
	it
	,x))

(aif 3
     (yoba it)
     0)

4

Problem, officer?

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

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

Общелисп же.

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

в лисп-2 на порядок меньше

В лисп-2 столько же, сколько и в лисп-1. Повторяю, лисп-1/2 с гигиеной никак абсолютно не связано.

а как гигиена справляется с количеством вычислений форм с сайд эффектами?

Никак. Какая связь между сайд-эффектами и гигиеной?

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

Так ты испортил макрос.

Это если гигиены нет. Если есть - ничего не портится.

Торчащий наружу + - это такая же анафора, как и it. Макрос означает «применить то, что в месте вызова называется сложением».

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

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

Problem, officer?

У тебя йоба неправильная. Надо (aif (+ x 1) x it), а не (aif (+ x 1) it x). И форма должна вернуть 3.

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

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

Эта информация достаётся интроспекцией из окружения, механизм макросов тут не при чём.

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

Биндинги создаются в рантайме, макросы разворачиваются даже до компиляции. Соответственно, видны будут символы только до того момента, когда форма раскрываться начала. И, собственно, какое это имеет отношение к гигиене?

Ну потому что это информация из компайлтайма, точнее из первой фазы :)

Макросы раскрываются до непосредственно компиляции. Либо какой-то аспект при объяснении гигигены был упущен, либо таки биндинги к гигиене отношения не имеют :)

Благодаря этому можно сравнивать идентификаторы по их биндингу и в частности реализовать нормальный макростепер

Это всё интроспекция в рантайме.

То есть вообще, если экспандер видит несвязанную переменную, он дает ошибку «unbound variable».

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

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

Эта информация достаётся интроспекцией из окружения, механизм макросов тут не при чём.

Нет, она как раз связана с макросами. В окружении этой информации просто нет.

Биндинги создаются в рантайме

Нет, биндинги создаются в первой фазе (то есть во время экспанда, по сути).

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

Именно по-этому нужно два прохода экспандера.

И, собственно, какое это имеет отношение к гигиене?

Прямое. Гигиена - это механизм для управления биндингами.

Макросы раскрываются до непосредственно компиляции.

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

Это всё интроспекция в рантайме.

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

Как он может видеть, если переменная забаундится в рантайме?

Потому что переменные баундятся во время экспанда, очевидно.

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

С интернингом символов тут нет никакой связи.

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

Нет, она как раз связана с макросами. В окружении этой информации просто нет.

Соурс локейшн к макросам отношения не имеет.

Прямое. Гигиена - это механизм для управления биндингами.

Ты путаешь intern и bind. Intern создаёт символ, bind привязывает к нему значение.

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

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

С интернингом символов тут нет никакой связи.

Выше уже приводили правильное определение гигиенических макросов: они не делают неконтроллируемый интерн. Это всё.

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

Анонимус, посоветуй литературы по теме. В референсе Racket черт ногу сломит и не хватает примеров.

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

Гайд Racket.

А в нем многие вопросы вообще не раскрыты. Типа тех же фаз или вилл.

//its ryrsom

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

А в нем многие вопросы вообще не раскрыты. Типа тех же фаз или вилл.

Гайд Racket + референс Racket.

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

Соурс локейшн к макросам отношения не имеет.

Ну зачем вы говорите о том, чего не знаете? Именно за счет макросов работа с ним и происходит. Хорошо, мы поступим просто - покажите мне, как при помощи методов интроспекции узнать source location выражения.

Ты путаешь intern и bind. Intern создаёт символ, bind привязывает к нему значение.

Именно. Интерн вообще не важен - он ни к макросам ни к гигиене никакого отношения не имеет вообще. Все символы интернятся (и скорее всего это будет вообще во 2 фазе, то есть во время раскрытия тела определения макроса) А вот бинд происходит во время экспанда макровызовов.

Работа с окружением (интроспекция) - свойство рантайма.

Конечно же нет. Окружение определено статически, с ним работают макросы.

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

Еще раз, гигиена - это средство для контроля за биндингами. Она позволяет выбирать какие биндинги будут у символа, менять их и т.п.. То есь окружение вполне себе существует при раскрытии.

Выше уже приводили правильное определение гигиенических макросов: они не делают неконтроллируемый интерн. Это всё.

Конечно, нет. Гигиена никак не связана с интерном, совершенно никак. Гигиена управляет биндингами. Если мы говорим о простейшей гигиене (неуправляемой, как в р5рс), то гигиена делает ровно следующее - устанавливает биндинги для всех используемых в макросе символов на область определения макроса (если эти биндинги там есть, конечно же, отсюда следует что, они должны существовать во время экспанда, иначе гигиена не могла бы работать). Вы бы это, конечно, знали, если бы были в курсе что такое гигиена и работали хоть раз с гигиенической макросистемой.

Вообще бросайте привычку говорить о том, о чем не знаете совершенно ничего. Плохая привычка.

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

Правильно тебе сказали - доки к racket. Собственно, это вообще лучшие доки какие видел, так что грех жаловаться (тот же жуткий гиперспек со своими сепульками и рядом не стоял). Можешь еще добавить статьи plt team, там часто более доступно раскрываются те самые фазы, особенности рантайма, и объясняется зачем нужна та или иная фишка, и как оно применяется на практике. Книжку по ракете они пишут, но еще не дописали. Ну и всегда можешь задать вопрос на маиллисте - ответ обычно быстрый и исчерпывающий.

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

Ну зачем вы говорите о том, чего не знаете? Именно за счет макросов работа с ним и происходит.

Ну покажи механизм, как это происходит.

Хорошо, мы поступим просто - покажите мне, как при помощи методов интроспекции узнать source location выражения.

Если выражение анонимное, то никак. Привязанное к символу - функции binds-who, who-binds, calls-who, who-calls в Лиспворксе, например.

Гуйня имеет возможность подчёркивать места с ошибочками за счёт eval-hook и macroexpand-hook, а не из-за каких-то волшебных грибовмакросов.

Именно. Интерн вообще не важен - он ни к макросам ни к гигиене никакого отношения не имеет вообще. Все символы интернятся (и скорее всего это будет вообще во 2 фазе, то есть во время раскрытия тела определения макроса) А вот бинд происходит во время экспанда макровызовов.

Значение присваивается символу во время экспанда макроса? А-ха-ха. Мы точно под байндом (bind) одно и то же имеем в виду?

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

Конечно же нет. Окружение определено статически, с ним работают макросы.

Настолько статически, что у defmacro и macroexpand это входной аргумент, вобщем-то?

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

Настолько статически, что у defmacro и macroexpand это входной аргумент, вобщем-то?

Какой defmacro? Какой macroexpand? Мы о гигиеничесикх макросистемах говорим, при чем тут defmacro?

Забудьте про комомон лисп, он тут не при делах.

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

Ну покажи механизм, как это происходит.

Так я выше уже показывал пример с макросом.

Если выражение анонимное, то никак.

Ясно, то есть в принципе никак, ведь 99% всех выражений - анонимные. Замечательно, чо. О том уж чтобы делать трейсинг выражения на протяжении экспанда и речи нет - если выражение ушло в макрос, то пизда вам пришла, его оригинальный source location уже никак и ниоткуда не достать. Именно по-этому в racket точно указывается место ошибки и позиция конкретного выражения а в общелиспе выблевыается простыня раскрытого кода.

Гуйня имеет возможность подчёркивать места с ошибочками за счёт eval-hook и macroexpand-hook, а не из-за каких-то волшебных грибовмакросов.

Ну вот мой старый пример:

(defmacro yoba (invalid-expr) invalid-expr)
(yoba (+ 1 "2"))
покажите как сделать так с вашими хуками, чтобы здесь мне ИДЕ указало место ошибки - выражение "(+ 1 «2»)", локация - 2 строка, 7 позиция. Чего уж проще, не так ли?

Значение присваивается символу во время экспанда макроса? А-ха-ха. Мы точно под байндом (bind) одно и то же имеем в виду?

байнд это не установление значения, а связывание идентификатора (да, может в коммон лисп по-другому, но ведь о коммон лиспе и не говорил никто). То есть (let ([x 1]) (display x)) - экспандер проходит, видит х в лете, добавляет его в лексический контекст. Потом видит х в display, смотрит в лексический контекст, видит что там есть этот х, проверяет не зашадовлен ли он, какие у него синтаксические метки (не обращайте внимание, это особенности реализации гигиены) и устанавливает в контексте х в display, что это точно вот именно тот х, который определен в let, а не какой-то другой. Соответственно если экспандер увидит х, а до этого его в лексическом контексте нет (то есть он не определен дефайном или летом), то будет эррор - unbound variable

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

Какой defmacro? Какой macroexpand? Мы о гигиеничесикх макросистемах говорим, при чем тут defmacro?

Да механизм-то одинаковый. Различие принципиальное есть, но разговор про это различие как-то не складывается.

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

Да механизм-то одинаковый.

механизм как раз принципиально разный и рантайм поддерживающий этот механизм принципиально разный :)

В чем разница я уже объяснил, но вы зачем-то начали «а в коммон лисп не так!». Ну конечно не так, никто и не говорил иного.

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

Ясно, то есть в принципе никак, ведь 99% всех выражений - анонимные. Замечательно, чо. О том уж чтобы делать трейсинг выражения на протяжении экспанда и речи нет - если выражение ушло в макрос, то пизда вам пришла, его оригинальный source location уже никак и ниоткуда не достать.

Ну вот собрал sexp в рантайме и сунул его в compile. Или из stream считал. Какой source location у второй скобки в той форме? В общем случае у произвольной формы сорс локейшена нет. Если ваша ракета позволяет найти определение произвольного sexp'а за счёт source location'а, а не поиска по исходникам, то я на это хочу посмотреть. Т.е. вводишь в каком-нибудь инпуте, жмёшь капу - оп, нашли.

покажите как сделать так с вашими хуками, чтобы здесь мне ИДЕ указало место ошибки - выражение "(+ 1 «2»)", локация - 2 строка, 7 позиция. Чего уж проще, не так ли?

http://13-49-ru.blogspot.com/2010/07/cltl2-vs-ansi.html

байнд это не установление значения, а связывание идентификатора .. то будет эррор - unbound variable

У вас в ракете нет динамических экстентов? Связать символ в рантайме нельзя?

(let ([x 1]) (display x)) ... устанавливает в контексте х в display, что это точно вот именно тот х, который определен в let, а не какой-то другой

А какой в этом примере может быть другой x?

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

механизм как раз принципиально разный и рантайм поддерживающий этот механизм принципиально разный :)

Да всё так же. Если отбросить макросы, то движок языка будет одинаковым для lisp-1 и lisp-2. Да и с макросами тоже отличий не будет особых.

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

Ну вот собрал sexp в рантайме и сунул его в compile. Или из stream считал. Какой source location у второй скобки в той форме? В общем случае у произвольной формы сорс локейшена нет.

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

Если ваша ракета позволяет найти определение произвольного sexp'а за счёт source location'а

Не понял, что?

http://13-49-ru.blogspot.com/2010/07/cltl2-vs-ansi.html

Пример-то будет? Повторюсь, мне хотелось бы узнать «как сделать так с вашими хуками, чтобы здесь мне ИДЕ указало место ошибки - выражение »(+ 1 «2»)", локация - 2 строка, 7 позиция. ". Впонле конкретный пример, пример простой (двустрочник).

А какой в этом примере может быть другой x?

Ну да, стоит немного переписать:

(define x 1)
(define-syntax-rule (yoba i) (define x i))
(yoba 2)
(let ([x 3]) (yoba 4) x)
вот у нас тут все 4 икса и все разные. По умолчанию тот икс, к которому мы обратились в let, это будет х = 3, но при желании можно сделать так, что это будет любой другой из этих 4.

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

Да всё так же. Если отбросить макросы, то движок языка будет одинаковым для lisp-1 и lisp-2.

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

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

У скобок соурса нет

Ну вы же только что утверждали, что есть у всего. А теперь соглашаетесь:

общем случае у произвольной формы соурса нет

Повторюсь, мне хотелось бы узнать «как сделать так с вашими хуками, чтобы здесь мне ИДЕ указало место ошибки - выражение »(+ 1 «2»)", локация - 2 строка, 7 позиция. ".

В общем случае, никак, т.к. в общелиспе все токены в location-обёртку не заворачиваются. Степпер в лиспворксе текущую форму выделяет.

вот у нас тут все 4 икса и все разные. По умолчанию тот икс, к которому мы обратились в let, это будет х = 3, но при желании можно сделать так, что это будет любой другой из этих 4.

А чего у вас дефайн делает в случае уже забинденного символа?

Кстати, «define: not allowed in an expression context».

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

Ну вы же только что утверждали, что есть у всего.

У выражений. Скобка - не выражение :)

А теперь соглашаетесь:

Он есть у всего, другое дело что он может быть определен плохо или некорректно. Однако, это бывает редко. Лучше пусть он будет определен в 99% случаев, чем в 1%.

В общем случае, никак, т.к. в общелиспе все токены в location-обёртку не заворачиваются.

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

Степпер в лиспворксе текущую форму выделяет.

Только степпер? А как же просто исполнение программы? Ну и ладно - покажите как это происходит в степпере лиспворкса. Пример я дал, пример простой, в чем проблема-то?

А чего у вас дефайн делает в случае уже забинденного символа?

Если в топлевеле то дефайн будет переопределен. Если module/internal definition context, то:

(define x 1)
(define x 2)
будет ошибка, а так:
(define x 1)
(let ([x 2]) (define x 3) x)
все будет хорошо. то есть можно шадовить.

Кстати, «define: not allowed in an expression context».

Это в expression, а контекст внутри let'a - internal definition context, а не expression. Ну и не только внутри let'a, а внутри всех внутренних бегинов де-факто т.к. они сплайсятся во время partial-прохода экспандера.

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

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

Ну это, удобно, конечно, но в (eval '(+ 1 «2») (scheme-report-environment 5)) весь eval подсвечивается.

Только степпер? А как же просто исполнение программы? Ну и ладно - покажите как это происходит в степпере лиспворкса. Пример я дал, пример простой, в чем проблема-то?

Показать что, картинку?

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

Показать что, картинку?

Да вы что угодно покажите, на чем будет видно, как там работает определение source location. Код я дал:

(defun yoba (err) err)
(yoba (+ 1 "2"))
Измените там его как надо, чтобы корректно отображалась source location (какие там у вас интроспекции надо и т.п.), а потом запустите на выполнение и покажите что получилось (можно без картинки, просто скажите какой соурс будет указан в ошибке, какое выражение выделено и т.п., я и так поверю).

Ну это, удобно, конечно, но в (eval '(+ 1 «2») (scheme-report-environment 5)) весь eval подсвечивается.

Так вы евалите список, у него source location пустой. Надо (eval #'(+ 1 2)).

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

Как ловко ушел от вопроса об отсутствии динамических областей видимости в схемке.

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

Как ловко ушел от вопроса об отсутствии динамических областей видимости в схемке.

Во-первых, я не видел этого вопроса, во-вторых - если под динамическими областями видимости понимаются динамические переменные, то с ними в схемке все в порядке (параметры). Если понимается нечто другое - то что?

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

Вот мой вариант:

(defun symbolf (string &rest params)
  (intern (string-upcase (apply #'format nil string params))))


(defun gen-string (n bits)
  (with-output-to-string (s)
    (loop for i from (1- n) downto 0 collect
	 (if (logbitp i bits) 
	     (write-char #\d s)
	     (write-char #\a s)))))


(defun gen-code (n bits i code)
  (if (eq i n)
      code
      (gen-code n bits (1+ i)
		     (list (if (logbitp i bits) 'cdr 'car)
			   code))))

(defmacro gen-cxr (n)
  `(progn
     ,@(loop for bits from 0 to (1- (expt 2 n)) collect
	    `(defun ,(symbolf "c~ar" (gen-string n bits)) (value)
	       ,(gen-code n bits 0 'value)))))


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

Так что все, кто вякал про перл стайл, могут обломится.

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

Все эти оптимизации я писал своими руками. Там абсолютно ничего сложного нет. Тот же несчастный SSA transform - десять строк на Datalog-е. Loop analysis - еще 5 строк на нем же.

Очень интересно. Каким образом можно использовать Datalog при построении SSA? Нужно унифицировать какие-то уравнения, но я не могу сообразить. Расскажите или дайте ссылки на литературу; или на компилятор, в реализации которого используется пролог. В моём компиляторе это несчастное построение SSA занимает довольно много кода. Мне интересно, как такие вещи можно кратко и декларативно описывать.

Вот как у меня:

1) Вычисляю фронт доминирования для каждого блока, используя простой алгоритм из [1]. Это уже 10 строк.

(* Вычисление фронта доминирования для всех блоков - - - - - - - - - - - - -  *)
let calc_domf cfg =

  (* Для каждого блока с более чем одним предшественником *)
  for_each_block cfg (fun label block ->
    if List.length block.Block.pred > 1 then
      let idom = Block.get_idom block in

      (* Для каждого предшествующего блока проходим по графу наверх
         до IDOM и добавляем этот блок во фронт доминирования для
         всех встречных блоков *)
      let rec run_up runner =
        if runner != idom then
          (Block.add_domf runner block;
           run_up (Block.get_idom runner))

      in Block.for_each_pred block run_up)

2) Вставляю PHI в нужных местах. Эта куча низкоуровневого говнокода по объёму не превышает псевдокод из [2].

(* Вставка PHI функций в каждом блоке - - - - - - - - - - - - - - - - - - - - *)
let insert_phi ctx cfg =

  (* Для каждой переменной *)
  ctx |> Hashtbl.iter (fun var info ->

    (* Очередь блоков для предстоящей обработки *)
    let worklist = Queue.create () in

    (* Множество уже обработанных блоков *)
    let processed = ref Set.empty in

    (* Добавляем в очередь каждый блок, в котором переменная могла измениться *)
    let added = ref info.Ctx.def_blocks in
    !added |> Set.iter (fun def -> Queue.add def worklist);

    (* До тех пор, пока очередь не пуста *)
    while not (Queue.is_empty worklist) do
      let block = Function.find_block cfg (Queue.take worklist) in

      (* Для каждого необработанного блока в DOMF этого блока *)
      Block.for_each_domf block (fun b ->
        let label = b.Block.name in
        if not (Set.mem label !processed) then

          (* Добавляем f-функцию для переменной *)
          (Block.add_phi b (var, None);
           processed := Set.add label !processed;

           (* Добавляем блок в очередь, если он не был просмотрен ранее *)
           if not (Set.mem label !added) then
             (Queue.add label worklist;
              added := Set.add label !added)))
    done)

3) Добавляю индексы к переменным в блоках. Это ещё 50 строк.

Можете показать, как у вас SSA-transform на прологе выглядит?

[1] Keith D. Cooper, Timothy J. Harvey, and Ken Kennedy, “A Simple, Fast Dominance Algorithm”

[2] Cytron, Ferrante, Rosen, Wegman and Zadeck, “Efficiently Computing Static Single Assignment Form and the Control Dependence Graph”, ACM Transactions on Programming Languages and Systems 13 (4): 451–490, October 1991.

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

У меня тоже тупые функции и примитивная макра. Проще чем у тебя собственнг, так как декларативно и с патернами. А твое решение - тот же обфусцированный перл что и в sbcl, так что поздравляю с эпическим отсосом.

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

обфусцированный перл что и в sbcl

он был в схеме из-за гигиены. В CL все можно сделать в любои стиле

(defun gen (depth name)
  (labels
      ((add-levels (acc n)
                    (when (> n 1)
                      (let ((nlvl (mapcan (lambda (x) (copy-list `((car ,x) (cdr ,x)))) acc)))
                        (nconc (add-levels nlvl (1- n)) nlvl))))
       (gen-char-seq (str lst)
                     (if (consp lst)
                         (gen-char-seq
                          (concatenate 'string str (if (eql (car lst) 'car) "A" "D"))
                          (car (cdr lst)))
                       str)))
    (mapcar
     (lambda (lst) (list (intern (concatenate 'string "C" (gen-char-seq "" lst) "R")) lst))
     (add-levels (copy-list `((car ,name) (cdr ,name))) depth))))

(defmacro gen-cxr (depth)
  `(progn ,@(mapcar (lambda (x) `(defun ,(car x) (val) ,(car (cdr x)))) (gen depth 'val))))

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

Гигиена в схеме обходится применением одной функции, дятел, я уже устал это повторять. Там большая часть кода - генерация списка всех комбинаций car/cdr.

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

я уже устал это повторять

значит пора переходить к аргументации своих утверждений.

Там большая часть кода

define-syntax, define-marco и т.д.

генерация списка всех комбинаций car/cdr

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

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

Да вы что угодно покажите, на чем будет видно, как там работает определение source location. Код я дал:

https://picasaweb.google.com/lh/photo/snk65Gv5N6jeTM2Mfce4f_6i8a9ulCuTztlddz1...

Так вы евалите список, у него source location пустой. Надо (eval #'(+ 1 2)).

Не подсвечивает. Короче, злобный обман это всё...

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

значит пора переходить к аргументации своих утверждений.

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

define-syntax, define-marco и т.д.

Так это чтобы вместо кривой обфусцированной перл-параши был понятный и лаконичный код.

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

Представь себе - у меня все то же самое. В любом случае, даже если предположить, что твое решение чем-то лучше (что, ясно, не так, но мы _предположим_), у меня этот макрос хотя бы пишется. В отличии от aif, который в общелиспе не пишется принципе. Так что кто SOOSNOLEY становится очевидным.

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

https://picasaweb.google.com/lh/photo/snk65Gv5N6jeTM2Mfce4f_6i8a9ulCuTztlddz1...

Неплохо, но это, как видно, реализовано за счет средств иде? А как на счет языковых средств - то есть если запускать без дебага и без иде? Ну и «+» выделился вместо полного выражения, хотя эта неточность простительна, конечно.

Не подсвечивает. Короче, злобный обман это всё...

Ну зачем врать? http://s017.radikal.ru/i416/1211/79/96dd75b10c69.jpg

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

Неплохо, но это, как видно, реализовано за счет средств иде?

100%

А как на счет языковых средств - то есть если запускать без дебага и без иде?

Если eval через хук делать, то твоя функция на каждую форму вызывается. Но информации о source location в CL нет никакой. В штатном виде, по-крайней мере.

Ну зачем врать?

В менюшке Language ракеты не было (самое близкое по названию - LazyRacket). С #racket действительно подсвечивает.

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

Если eval через хук делать, то твоя функция на каждую форму вызывается.

И на сколько снизится производительность с eval через хук? Кроме того, понятно, что в данном случае source location трейсится встроенным образом - то есть контроля со стороны макрописателя нет. А он нередко нужен - например, чтобы указать source выражения, сгенерированного внутри самого макроса. В общем, преимущество от наличия source перед его отсутствием для меня очевидно :)

А на счет лексической информации в рантайме, тут дело такое:

(let ()
  (struct yoba (x y))
  (match (yoba 1 2)
    [(yoba x y) (+ x y)]))
(код намеренно всунут внутрь let'a а не оставлен в топ-левеле) Здесь форма struct связывает во время экспанда с символом yoba статическую информацию о том, что это - структура, и что у нее есть соответствующие геттеры (они не обязательно будут yoba-x и yoba-y, по-этому нагенерить эти гетеры потом автоматически нельзя - только вытащить из статического yoba). match во время своего макрораскрытия проверяет, определено ли yoba как структура, потом вытаскивает из нее геттеры и генерирует с ними соответствующий код для паттерн-матчинга. Если бы yoba не было определено как структура - естественно, была бы ошибка во время экспанда. Все довольно легко реализуется (могу показать пруф-оф-концепт реализацию с объяснением), корректно работает в разных лексических контекстах, перекрывается и т.п.

Как подобную вещь реализовать в CL?

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

В менюшке Language ракеты не было (самое близкое по названию - LazyRacket). С #racket действительно подсвечивает.

Все языки из менюшки переопределяют стандартное поведение в репле и обработку исключений внешним хендлером. Вообще их не следует использовать, лучше ставить всегда «язык по выбору» и там #lang name.

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

И на сколько снизится производительность с eval через хук?

Не знаю, не проверял.

Как подобную вещь реализовать в CL?

Ты объясни, что твой код делает, и реализация какой именно вещи в CL интересует?

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

Ты объясни, что твой код делает, и реализация какой именно вещи в CL интересует?

Я же объяснил. struct добавляет во время экспанда в лексический контекст некоторую статическую информацию, match потом эту информацию во время экспанда использует. Можно ли в CL реализовать такой match? Более общо - можно ли (и если да - то как) экспандить макрос Ч в зависимости от экспанда некоего другого макроса Y? То есть как осуществлять взаимодействие между макросами во время экспанда? Вопрос важный, т.к. все интересные макросы завязаны на использование этой фичи. Без нее приходится писать кодеволкеры, но кодеволкеры не работают и за них бьют лицо.

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

Я же объяснил. struct добавляет во время экспанда в лексический контекст некоторую статическую информацию, match потом эту информацию во время экспанда использует. Можно ли в CL реализовать такой match? Более общо - можно ли (и если да - то как) экспандить макрос Ч в зависимости от экспанда некоего другого макроса Y? То есть как осуществлять взаимодействие между макросами во время экспанда? Вопрос важный, т.к. все интересные макросы завязаны на использование этой фичи. Без нее приходится писать кодеволкеры, но кодеволкеры не работают и за них бьют лицо.

Мне кажется, что нельзя, т.к. в CL порядок раскрытия макросов не специфицирован. Если бы он гарантированно «совпадал» с лексической вложенностью, то можно было бы передавать контекст через динамическую переменную, но сейчас я не вижу очевидного решения, кроме как подразумевающего написание кодволкера. И даже с кодволкерами было бы сложно реализовать макросы, зависящие одновременно друг от друга (в две стороны).

А почему за кодволкеры бъют? Это что, действительно такой сложный и чреватый ошибками подход?

Кстати, в CLtL2 есть доступные из макросов окружения с информацией о лексическом контексте: https://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node102.html . Эту фичу можно использовать в кодволкерах.

Дело не только в гигиене а еще в том, в синтаксических объектах, фазах, поддержки рантаймом, библиотеках и т.д..

Синтаксические объекты — это хорошо. Я не против новых возможностей, если эти новые возможности не отменяют старые. Система модулей, чёткое разделение на фазы в стиле MetaOCaml — это замечательно. Всё эти фичи позволяют не только использовать макросы в более агрессивном стиле, но и, как вы справедливо заметили, делать многие вещи, которые в CL делать сложно или совсем невозможно.

Но меня беспокоит именно вопрос гигиены (смирительной рубашки для искушённого макрописателя). Не сам факт существования гигиенических систем (это просто ещё один инструмент, часто полезный на практике), а то, что некоторыми Схемерами (например, разработчиками Racket) гигиенические макросы позиционируются как полноценная и строго более мощная замена для «устаревшего и ненужного» defmacro.

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

У defmacro предельно простая семантика. Это низкоуровневый инструмент, позволяющий делать маппинги из AST в AST на синтаксическом уровне. Что вижу в редакторе (S-выражения), то и мешу в макросах. Похожим образом в Tcl: вижу текст — мешу текст. Концептуально просто и интуитивно понятно.

Да, это опасный инструмент с известными проблемами, но его возможностей часто хватает.

Макросы Схемы же добавляют ещё один уровень сложности, заставляют использовать язык трансформеров для выражения таких вещей, которые выражаются и в базовом лиспе. Например, мне нужно знать одновременно про let и про syntax-local-introduce и не забывать отслеживать, в каких частях программы нужно использовать одну конструкцию, а в каких — другую.

Можно привести несколько случаев, когда вам надо было обходить гигиену? Возможно, я смогу привести пару идеоматических решений, которые снимут подобные проблемы :)

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

Например, мне уже знакома семантика формы let в Scheme, и если мне понадобится ввести новые биндинги в макросе, то я, не долго думая, использую этот же let. Так же и в Camlp4: захотел новый биндинг — использовал let из базового языка. Тупо, просто, интуитивно понятно.

Если бы я писал библиотеки, предназначенные для использования другими людьми, то, не вопрос, использовал бы в интерфейсе только гигиеничные макросы; но себя мне лишний раз насиловать не хочется. Возможно, что просто юз-кейсы у меня настолько простые, что и с defmacro получается писать программы, которые не разваливаются и которые мне самому несложно дописывать. Если нужно быстро написать throw-away прототип, то и write-only perl style себе позволяю, со страшным, абсолютно нечитабельным месивом из defmacro и неправославным «пидорасиньем AST голыми руками».

Да, грязно. Да, макросы могут протекать. Да, на грабли иногда наступаю.

Но этот инстумент не нарушает мой рабочий flow, т.к. в силу концептуальной простоты полностью загружается в оперативную человеческую память. Defmacro похож на мачете (простой и грубый инструмент, которого часто хватает для решения конкретных проблем), в отличие от макросов Racket, которые больше похожи на сложный (пусть и с хорошей инструкцией) швейцарский нож, с большим количеством неочевидных возможностей, изучение и (срочное) вспоминание которых запросто может меня из этого самого flow выбивать.

При этом опыт мне подсказывает, что нельзя делать скоропалительные выводы о концепциях, кажущихся неинтуитивными. Многие хорошие идеи часто кажутся интуитивно непонятными и неочевидными (собственно потому и не получают изначально широкого распространения). Поэтому я продолжу попытки освоения макросов Racket. Это ещё одна модель метапрограммирования, с которой мне хочется познакомиться поближе.

Если не секрет, зачем вы пишете всё это на linux.org.ru, да ещё и анонимно? Абстрактных монадических мужиков с lambda-the-ultimate подобное обсуждение заинтересовало бы как минимум не меньше, чем местную публику.

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

зачем вы пишете всё это на linux.org.ru, да ещё и анонимно?

Не слушай этого регистранта, анон, пиши на лоре. Это хорошее, полезное дело.

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

Я же объяснил. struct добавляет во время экспанда в лексический контекст некоторую статическую информацию, match потом эту информацию во время экспанда использует. Можно ли в CL реализовать такой match

Да, в лиспе можно добавлять некоторую информацию и потом её использовать.

Можно ли в CL реализовать такой match?

Я ещё раз повторю, что без понятия что это за «такой match».

Более общо - можно ли (и если да - то как) экспандить макрос Ч в зависимости от экспанда некоего другого макроса Y?

Конечно, можно. Макрос - это почти обычный лиспокод.

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

Я ещё раз повторю, что без понятия что это за «такой match».

Я выше подробно описал «что за такой». Хотя ваша попытка косить под дурочка сама овтечает на этот вопрос - нет, в Common Lisp это сделать нельзя.

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

А почему за кодволкеры бъют? Это что, действительно такой сложный и чреватый ошибками подход?

Потому что кодеволкер должен работать исключительно на раскрытом коде (иначе будут ошибки). Но в таком случае что будет, если у нас макрос с кодеволкером внутри макроса с кодеволкером? В результате все это работает либо с большими ограничениями, либо глючит.

Кстати, в CLtL2 есть доступные из макросов окружения с информацией о лексическом контексте: https://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node102.html .

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

Но меня беспокоит именно вопрос гигиены (смирительной рубашки для искушённого макрописателя). Не сам факт существования гигиенических систем (это просто ещё один инструмент, часто полезный на практике), а то, что некоторыми Схемерами (например, разработчиками Racket) гигиенические макросы позиционируются как полноценная и строго более мощная замена для «устаревшего и ненужного» defmacro.

Я уже говорил об этом. Если есть некое средство, которое предоставляет возможность для управления биндингами - то система с таким средством заведомо мощнее, чем система без такого средства. Далее вопрос лишь в том, как связываются переменные _по умолчанию_ - в месте вызова макроса или в месте определения. Это уже не влияет на мощность системы - лишь вопрос удобства. И логика там простая - раз практически все символы естественно связывать по месту объявления и лишь некоторые - по месту вызова, то естественно сделать так, чтобы по умолчанию связывание происходило по месту объявления. И мы получаем гигиену.

Что вижу в редакторе (S-выражения), то и мешу в макросах.

Надо сказать, что в схемах благодаря паттернам это проявляется лучше :)

Макросы Схемы же добавляют ещё один уровень сложности

Все совершенно наоборот. Они позволяют не думать о тех вещах, о которых надо думать в гигиенической системе (т.к. обо всем подумает гигиена). Компьютерное время дешевле человеческого. Если задача может быть эффективно решена на компьютере, то зачем ее решать руками? Пусть компьютер и решает. А человеку оставим задачи, которые компьютер решить не в состоянии (благо на всех хватит :)).

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

Гигиену мне приходится обходить всегда, когда нужно подцепить «неявно» биндинги из контеста раскрытия макроса, создать новые биндинги, сгенерировать макросы из макроса.

Обход гигиены в классическом макросе, который вводит биндинги, - это _одна_ строчка. Несколько сложнее может быть в случае написания реально сложного макроса, с реализацией эдак на 1kloc (не общелисповых, ясно, в общелиспе это было бы все 10kloc :))

Можно пару примеров _конкретных_ ваших макросов, где вам пришлось обходить гигиену и все это было чрезмерно неудобно (ну или где вы плюнули и переписали на дефмакро)?

Но этот инструмент не нарушает мой рабочий flow

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

При этом опыт мне подсказывает, что нельзя делать скоропалительные выводы о концепциях, кажущихся неинтуитивными.

Для мения гигеническая система намного интуитивнее, чем негигиеническая. Действительно, гигиена respect to lexical structure of program - то есть работает согласовано с лексической структурой программы, а тело макроса «замыкается» на окружающий лексический контекст в точности как тело функции. С другой стороны, макросы в негигиенической системе ломают лексическую структуру, замыкаясь по своим особенным, уникальным правилам. Что проще? :)

Если не секрет, зачем вы пишете всё это на linux.org.ru, да ещё и анонимно?

Ну зашла речь о гигиене, почему бы не обсудить? Вот вам это, видимо, интересно - а мне объяснить не сложно. Польза от разговора очевидна, разве нет?

Абстрактных монадических мужиков с lambda-the-ultimate подобное обсуждение заинтересовало бы как минимум не меньше, чем местную публику.

На лямбде и мейнтейнеры Racket неплохо справляются :))

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

Не описал.

match должен взаимодействовать со struct, бросая ошибку при попытке матчить структуру, которая неопределена, либо успешно раскрываясь в геттеры соовтетствующей структуры, и вводя новые биндинги, если она определена. Это должно происходить во время экспанда, естественно.

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

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

Гигиенические макросы бывают двух видов - сложные и реально сложные.

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

Гигиенические макросы бывают двух видов - сложные и реально сложные.

С чего ты взял?

Вот например пара простых макросов:

#lang racket
(require syntax/parse/define
         (for-syntax syntax/parse))

(begin-for-syntax
  (struct static-struct (getter-list constructor predicate)
    #:property prop:procedure (λ (this stx)
                                (with-syntax ([constr (static-struct-constructor this)])
                                  (syntax-parse stx
                                   [(_ args ...) #'(constr args ...)]
                                   [_ #'constr])))))

(define-simple-macro (my-struct name:id args:id ...)
  #:with n #`#,(length (syntax->list #'(args ...)))
  #:with (getters ...) (for/list ([i (in-range (syntax-e #'n))]) #`(λ (x) (vector-ref x #,i)))
  (begin (define (predicate x) (= n (vector-length x)))
         (define (constructor args ...) (vector args ...))
         (define-syntax name (static-struct (list #'getters ...) #'constructor #'predicate))))

(begin-for-syntax
  (define-syntax-class match-pattern
    (pattern ((~var name (static static-struct? "struct name")) args ...)
             #:do [(define static-inf (syntax-local-value #'name))]
             #:fail-unless (= (length (syntax->list #'(args ...))) (length (static-struct-getter-list static-inf)))
                           "wrong number of constructor's arguments"
             #:with predicate (static-struct-predicate static-inf)
             #:with (getters ...) (static-struct-getter-list static-inf)))
  (define-syntax-class match-clause
    (pattern [patt:match-pattern body:expr ...+]
             #:with predicate #'patt.predicate
             #:with (getters ...) #'(patt.getters ...)
             #:with (args ...) #'(patt.args ...))))

(define-simple-macro (my-match arg:expr clause:match-clause ...+)
  (let ([tmp arg])
    (cond [(clause.predicate tmp) 
           (let ([clause.args (clause.getters tmp)] ...)
             clause.body ...)] ...)))
(my-struct test x y z)
(my-match (test 1 2 3)
          [(test x y z) (+ x y z)])
->
6
Ну это в нормальной макро-системе они простые, а в общелиспе они будут реально сложными, да.

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

Стоит ли изучать С в купе с Erlang?

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

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

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

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

Это все очень благородно, но вот что интересует.

В свое время ракетка благополучно вылетела из поля моего зрения благодаря, не в последнюю очередь, непоняткам со стандартами (R5RS vs R6RS и все против всех). А на сегодня что собой представляет ракетка и в каком направлении они развиваются?

Сейчас ты снова обратил мое внимание на эту платформу, и очень вовремя — мне предстоит интересная задача, но надо определиться с инструментами. И желательно, чтоб в ближайшие лет 5 не было неожиданностей.

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

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

а ты сам-то можешь объяснить смысл своего примера, какую проблему решает твой код? (+ 1 2 3) и так будет 6 в CL, что в рантайме, что при макроэкспанде.

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

а ты сам-то можешь объяснить смысл своего примера, какую проблему решает твой код? (+ 1 2 3) и так будет 6 в CL, что в рантайме, что при макроэкспанде.

Это реализация паттерн-матчинга. Соответственно, он решает те проблемы, что решает паттерн-матчинг.

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

реально сложного макроса

в CL это просто ещё одна программа, обрабатывающая AST на стадии макроэкспанда.

И не потому что он значительно сложнее, а потому что «ну я уже умею делать это при помощи инструмента Х, зачем мне нужен инструмент Y»?

a) исходно гигиена решает только одну проблему - запрещает любую коллизию символов b) в лисп-2 из-за отдельного пространство для функций проблема стоит менее остро. c) в любом случае формы, переданные макросу биндятся к (gensym) чтобы избежать повторных вычислений.

где же реальная выгода гигиены?

Что проще

Произвольное преобразование AST -> AST, то есть CL.

а тело макроса «замыкается» на окружающий лексический контекст в точности как тело функции.

левое определение.

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

А на сегодня что собой представляет ракетка и в каком направлении они развиваются?

Это схема, сделанная правильно, с большим количеством батареек. При чем развитая макросистема, да и вообще инструментарий для запиливания и использования ДСЛей с полноценной поддержкой со стороны рантайма и ИДЕ считается одной из главных фич.

И желательно, чтоб в ближайшие лет 5 не было неожиданностей.

Какого рода неожиданностей?

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

Соответственно, он решает те проблемы, что решает паттерн-матчинг

В CL примитивно делается - обычная последовательность if-let. Даже без тонны сахара схемы кода будет реально мало.

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

в CL это просто ещё одна программа, обрабатывающая AST на стадии макроэкспанда.

В ракетке тоже. Вопрос в том, надо ли реализовывать все на низком уровне (как в общелиспе) или есть удобные высокоуровневые средства, которые упрощают решение, сокращают его и повышают надежность.

a) исходно гигиена решает только одну проблему - запрещает любую коллизию символов

Эта проблема _никак_ не связана с гигиеной.

b) в лисп-2 из-за отдельного пространство для функций проблема стоит менее остро.

лисп-2 тоже _никак_ не связан с этой прблемой.

c) в любом случае формы, переданные макросу биндятся к (gensym) чтобы избежать повторных вычислений.

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

где же реальная выгода гигиены?

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

Произвольное преобразование AST -> AST, то есть CL.

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

левое определение.

Это не левое определение, это и есть определение гигиены, дятел. Переменные замыкаются на область определения макроса aka «respect to lexical structure of program», как указано в стандарте той же схемы.

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

В CL примитивно делается - обычная последовательность if-let.

Ну так попробуй, лол.

Даже без тонны сахара схемы кода будет реально мало.

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

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

Ну так попробуй, лол.

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

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

есть удобные высокоуровневые средства, которые упрощают решение, сокращают его и повышают надежность

тут джава вне конкуренции.

Эта проблема _никак_ не связана с гигиеной.

да, да в твоём понимании гигиена - это синтаксический сахар схемы.

Это не левое определение, это и есть определение гигиены, дятел.

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

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

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

Да ты что? Ну так может ты его приведешь, с пруфами?

да, да в твоём понимании гигиена - это синтаксический сахар схемы.

Нет.

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

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

Никто кроме тебя понятия не имеет, что заложено в твой код. Четко опиши что хочешь увидеть от CL решения.

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

Это схема, сделанная правильно

И, насколько я понял, они поддерживают #r5rs?

Какого рода неожиданностей?

Ну, знаешь, как бывает: «посоны, мы тут внезапно осознали, что все ети годы жили неправильно. Долой!» Конечно, их история не предполагает подбного неадеквата, но что-то уж слишком часто последнее время такая фигня случается, на, казалось бы, совершенно ровном месте. Нехотеть.

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

Нет.

а да, ты только про 99% писал.

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

И, насколько я понял, они поддерживают #r5rs?

В качестве #lang'a да, но racket как язык полным суперсетом r5rs не является (есть некоторые несовместимости).

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

Четко опиши что хочешь увидеть от CL решения.

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

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

Да, как #lang вполне достаточно.

Тогда внутри r5rs-модуля никаких проблем не будет. Но если мешать ф-и из r5rs-модуля и из racket-модуля, то надо учесть, что в первом пары - мутабельные, а во втором - иммутабельные, соответственно, ф-и при импорте надо будет обернуть враппером.

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

с тобой можно как-то связаться?

Да. 31415anon31415@gmail.com

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

Никто кроме тебя понятия не имеет, что заложено в твой код. Четко опиши что хочешь увидеть от CL решения.

Я понял, что он хочет увидеть, но мне пример писать лень (машину купил, голова другим забита). Чтобы так же красиво выглядело, надо будет DSL сочинять.

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

Я понял, что он хочет увидеть, но мне пример писать лень (машину купил, голова другим забита). Чтобы так же красиво выглядело, надо будет DSL сочинять.

Собственно, опуская ДСЛ, у вас будут две ключевые трудности - отсутствие source (а значит корректно указать кусок выражения, в котором ошибка синтаксиса, вы не сможете, то есть вообще никак, хоть упишитесь дслями) и отсутствие в общелиспе поддержки статической информации. Скорее всего, вы соорудите какой-нибудь хеш и будете туда совать при вызове struct нужную информацию и смотреть ее при вызове match (так это всегда и делают в общелиспе). И, естественно, работать это не будет. А альтернативных средств CL не предоставляет.

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

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

надо учесть, что в первом пары - мутабельные, а во втором - иммутабельные, соответственно

Да, этот момент я прохлопал. Спасибо

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

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

http://www.cliki.net/pattern matching

И, естественно, работать это не будет.

в схеме, да, нельзя. гигиена не позволяет полноценную работу со списками. приходится любую элементарную функцию для работы с ними ещё раз приписывать всякими define-syntax специально для макросов.

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

Есть две формы - одна определяет некоторую структуру, другая позволяет матчить по этим структурам значение

Просто море либ для CL.

(естественно, решение как и что матчить принимается во время экспанда из соображений производительности).

принципиально неразрешимая задача, поскольку данных на этой стадии нет. видишь, ты даже в элементарных вещах путаешься.

Все должно работать корректно в смысле лексической структуры программы,

задача компилятора.

а сообщения об ошибках должны выдаваться адекватно, не в виде полотнищ раскрытого кода, как это обычно делается в общелиспе.

макросы их синтаксис к языку отношения не имеет. какие захочешь - такие ошибки и выдавай.

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

в схеме, да, нельзя.

Можно, конечно.

приходится любую элементарную функцию для работы с ними ещё раз приписывать всякими define-syntax специально для макросов.

Нет, не приходится. просто берешь и используешь эту любую функцию. Никаких проблем.

http://www.cliki.net/pattern matching

Прекрасно. Выбираем какую-нибудь реализацию наугад - ну пусть будет cl-match. И видим: «struct prefix &rest field-forms The value must be a structure, and each field must be accessible with a function whose name begins with prefix. Each field form can be either a two-element list, where the first element is the field name and the second element is a pattern, or a symbol (the field's name), which always matches.»

То есть никакого обмена статической информацией не идет, просто реализация НАДЕЕТСЯ, что есть такая структура и у нее будут ацессоры нужного вида (и они обязательно должны начинаться с префикса, ибо не дай бог. то, что ацессоров может даже и не быть в области видимости реализация даже не предполагает). Ну надежда умирает последней, чо. Посмотрим дальше:

(defmac defpattern (patrn args &body body)
  (check-type patrn symbol "DEFPATTERN: 1st arg must a symbol")
  `(eval-always
    (setf (get ',patrn 'cl-match-pattern) #f(lett ,args _ ,@body))))
опять костыль, никакого корректного взаимодействия с областью видимости, будет неожиданно ломаться в случайный местах, использовать нельзя.

О переусложненности и вырвиглазности кода упоминать не стоит - все-таки это CL. Обработки ошибок нету вообще как класса - обычно макрописатели в CL даже за нее не принимаются, т.к., видимо, понимают, что при полном отсутствии соответствующих инструментов это будет титанический труд. Как и ожидалось - it just does not work. Ничего из требований не выполнено, о 50% функционала никакой речи нет - хорошо если 10% соберется.

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

принципиально неразрешимая задача, поскольку данных на этой стадии нет. видишь, ты даже в элементарных вещах путаешься.

Чудесно - оказывается в моем написанном на коленке за 10 минут коде решается неразрешимая задача!

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

задача компилятора.

Точнее экспандера. Но в общелиспе он эту задачу не решает - гигиены-то нет. По-этому описанная передача статический информации в CL нереализуема.

макросы их синтаксис к языку отношения не имеет. какие захочешь - такие ошибки и выдавай.

Проблема в том, что информации о source location в макросах коммон лиспа нет, а потому нет способа выдать корректные сообщения об ошибках - т.к. там эта информация нужна. В результате использовать в CL макрос, не читая его исходник, и не нзая, во что он раскрывается -невозможно.

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

Я другой анонимус. Просто уточню - в дискуссию я вступать не буду.

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

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

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

ацессоров может даже и не быть в области видимости

в лисп-1 понятно, что внутри let всё легко сломается. лисп-2 и система сборки решает эти проблемы на практике, а не в воспалённом воображении теоретиков. у меня сложилось мнение, что макросы схемы - это такой lisp++, где путают эффективность и банальную переусложнённость.

реализация даже не предполагает

и не должна. макрос - функция над AST, зависимость от раскрытия от окружения и фаз луны - явно плохая идея.

О переусложненности и вырвиглазности кода упоминать не стоит

обычная обработка списков.

Обработки ошибок нету вообще как класса

даже в четырех строчках, что ты скопипастил одна из них - именно обработка ошибок.

Нет, не приходится. просто берешь и используешь эту любую функцию

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

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

потому что в CL макросистема представляет собой устаревший кусок говна

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

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

большая часть CL может быть этими макросами, и всё работает. очередное неверное утверждение от тебя.

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

Есть же либа cl-match, которая, по-моему, как раз и представляет собой ракетовский match http://common-lisp.net/project/cl-match/doc/clmatch.htm

Так я выше написал про нее. Груда костылей, с никаким функционал, да еще и глючная.

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

в лисп-1 понятно, что внутри let всё легко сломается. лисп-2 и система сборки решает эти проблемы на практике, а не в воспалённом воображении теоретиков. у меня сложилось мнение, что макросы схемы - это такой lisp++, где путают эффективность и банальную переусложнённость.

Опять сказки про лисп-2 который решает все проблемы, лол. Да ничего лисп-2 не решает. Более того - он вообще никак не влияет на обсуждаемые аспекты.

и не должна.

Реализация не должна работать? Заебись, лол.

макрос - функция над AST, зависимость от раскрытия от окружения и фаз луны - явно плохая идея.

Ага, и в результате общелисперы на каждый чих пишут глючащие кривые кодеволкеры.

обычная обработка списков.

Именно. Потому и вырвиглазно.

даже в четырех строчках, что ты скопипастил одна из них - именно обработка ошибок.

Одной единственной ошибки. А где остальные обработки остальных? Нету. Это не говоря уже о том, что и та единственная обработанная обработана криво.

что-то ты совсем заврался походу.

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

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

Тем и отличается полноценная макросистема от общелиспового препроцессора, что ничего в этом случае не ломается.

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

большая часть CL может быть этими макросами, и всё работает. очередное неверное утверждение от тебя.

Ну так на безрыбье и рак - рыба. Так и работает - куча блевотного кода вместо декларативных паттернов, чтение исходников и результата экспанда вместо нормальной отладки. Короче - мыши плакали, кололись, но жрали кактус. Чего ж еще делать? Пустыня, а пить охота.

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

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

Функционально мощнее, т.к. добавляет новые возможности, не отменяя старых (простого defmacro).

Далее вопрос лишь в том, как связываются переменные _по умолчанию_ - в месте вызова макроса или в месте определения. Это уже не влияет на мощность системы - лишь вопрос удобства.

Именно так, поэтому я часто использую define-macro. _Мне_ так удобно.

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

А мне связывание по месту вызова кажется более естественным, т.к. это концептуально проще. Если вижу, что желательна и уместна гигиена — использую гигиену. Если чувствую, что и defmacro сгодится — не парюсь и использую defmacro. Что плохого в том, чтобы иметь возможность использовать простые инструменты?

Если мне нужно забить гвоздь, то я делаю это молотком, даже осознавая риск попадания молотком по пальцу.

Что вижу в редакторе (S-выражения), то и мешу в макросах.

Надо сказать, что в схемах благодаря паттернам это проявляется лучше :)

Паттерн матчеры, list comprehensions, генераторы визиторов — очень полезные инструменты. Только к гигиене это никакого отношения не имеет. Никто не мешает подобные инструменты использовать в defmacro.

Макросы Схемы же добавляют ещё один уровень сложности

Все совершенно наоборот. Они позволяют не думать о тех вещах, о которых надо думать в гигиенической системе (т.к. обо всем подумает гигиена). Компьютерное время дешевле человеческого. Если задача может быть эффективно решена на компьютере, то зачем ее решать руками? Пусть компьютер и решает. А человеку оставим задачи, которые компьютер решить не в состоянии (благо на всех хватит :)).

Для меня сейчас неочевидно, что использование гигенических систем оправдывает себя во всех возможных случаях. Я вижу, что гигена часто создаёт ментальный оверхед при создании макроса, облегчая при этом оверхед от его использования; при этом я не уверен, что упрощение использования всегда перевешивает усложнение написания.

Проблема просто в том, что первый инструмент вы освоили, а второй - осваивать не хотите.

Почему вы думаете, что не хочу? Зачем мне тогда вообще с вами разговаривать? Чтобы потроллить? Чтобы наставить на путь истинный? :-) Мне действительно очень интересен этот вопрос. Я его _для себя_ хочу решить, из самых эгоистических побуждений.

Пишу дальше...

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

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

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

Есть замечательный язык Haskell, делать многие вещи в котором мне неудобно. Поэтому когда мне нужен ML, то я обычно использую гораздо более простой и прямолинейный OCaml, в котором могу легко (пусть, возможно и некрасиво) делать некоторые простые вещи.

«Мужчина!» — говорят мне абстрактные монадические мужики — «Используй трансформаторы монад и все твои проблемы волшебно, в одно мгновенье, покажутся психическим недугом императивщика. Хаскелл вернёт тебе часы, украденные отладкой ошибок — половину жизни обратно получишь ты!».

Но нет вдохновенья и болит голова и рука пишет код некрасивый. И родное, привычное к ML-ю перо не в силах создать музыки IO. Что случилось? — Я глуп? Не способен понять? Не готов к освоенью подхода? А может подход не подходит ко мне; не подходит подхода природа?

«Мужчина, одумайся!» — не унимаются монадисты — «Ты болен, а мы предлагаем тебе пилюлю! Мы сдуем с тебя копоть, прочистим мозги от дыма! Ты расширишь своё сознание сакральным пониманием стрелок и расширений GHC!» — заманивают меня они.

Сознание сопротивляется, но интуиция выносит вердикт — этот инструмент мне не очень хорошо подходит. Меня не тянет к нему и созерцание кода не приводит в восторг. В последнее время я склонен доверять интуиции.

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

Вообще, сравнение возможностей языков программирования — очень сложное и неблагодарное дело. То, что хорошо работает для одного человека, может очень плохо работать для другого или проявляет себя с неожиданной стороны в командной работе (например, когда два лиспера легко читают и дорабатывают свой код, но абсолютно не способны читать код друг друга).

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

Да и не совсем понятно, каким образом можно подобные исследования проводить. Слишком большое значение имеют способности программиста. Рядом со мной на работе сидит сумасшедший C++-ник, который висит в топе на TopCoder и похожих сайтах (олимпиадное программирование). Существуют задачи, в которых он меня _на порядок_ уделает по скорости, используя богомерзкие плюсы при кодировании не самых тривиальных вещей (например, он при мне, во время контеста, за час закодил на коленке довольно сложный вариант симплекс-метода (branch and cut, 800 строк на плюсах) и успешно сдал задачу).

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

Я разве что-то говорил про списки? Меня сейчас только вопрос гигиены интересует. Паттерны в схемовских макросах — так, удобный сахарок, который и к defmacro легко прикручивается.

Обход гигиены в классическом макросе, который вводит биндинги, - это _одна_ строчка. Несколько сложнее может быть в случае написания реально сложного макроса, с реализацией эдак на 1kloc (не общелисповых, ясно, в общелиспе это было бы все 10kloc :))

Можно пару примеров _конкретных_ ваших макросов, где вам пришлось обходить гигиену и все это было чрезмерно неудобно (ну или где вы плюнули и переписали на дефмакро)?

Я сейчас попытался написать в Racket игрушечный матчер, умеющий использовать статическую информацию о типах структур. Сразу столкнулся с несколькими моментами, в которых нужно ломать гигиену, и «изящного гигиенического» решения для которых я не придумал (хотя доки долго копал).

Вашу реализацию пока не изучал (так было бы неинтересно). Сейчас кину код. Попинаете и покажете, каким образом это можно (нужно) было писать в идиоматичном для Racket стиле.

Сейчас код будет... Только на поддержку пользователей отвлекусь...

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

сидит сумасшедший C++-ник, который висит в топе на TopCoder и похожих сайтах (олимпиадное программирование).

Плюсы решают в алгоритмических задачах, достаточно посмотреть на всякие там рейтинги.

Худо-бедная высокоуровневость, скорость и наличие килотонн готовых структур данных делают свое дело.

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

mrm, ставлю на анонимного троля - твой выше всяких похвал лаконичный и логичный посыл не сподвигнет его на конструктив. Но попытаться стоит, ибо даже если твои вопросы останутся «гласом вопиющего в пустыне», поступок твой зело люб ;)

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

Итак, я попытался написать в Racket очень простой макрос match-struct со следующей функциональностью:

; Пусть у нас есть две разных структуры

(struct str1 (a b c))
(struct str2 (c d e))

(define my-str1 (str1 1 2 3))
(define my-str2 (str2 3 4 5))

; Должен вернуть список значений полей переданной структуры
(define (test-match s)
  (match-struct s
    (str1 -> (list a b c))
    (str2 -> (list c d e))))

(test-match my-str1) ; -> (1 2 3)
(test-match my-str2) ; -> (3 4 5)

Понятна идея? match-struct определяет тип структуры и создаёт в нужной ветке биндинги, соответствующие полям этой структуры. Информация о полях определяется статически.

Сначала создаём вспомогательный макрос with-struct, который берёт тип структуры и создаёт биндинги, соответствующие полям (и содержащие значения полей):

(begin-for-syntax

 ; Этот макрос -- простой сахарок для доставания информации о структуре
 ; В синтаксисе используется стрелочка (ну вот нравится мне так)
 ; Мелкий вопрос: как сказать макросу, что это ключевое слово?
 (define-simple-macro (with-struct-info v (it) -> body ...)
   (let ((it (extract-struct-info (syntax-local-value v))))
     body ...))

 ; Получаем имена символов, переданных в syntax-case
 (define-simple-macro (with-symbol-names (in ...) body ...)
   (let ((in (symbol->string (syntax->datum in))) ...)
     body ...))

 ; Генерация имени для биндинга, соответствующего полю
 ; Не придумал, как эту информацию доставать статически. В struct-info её нет
 ; (get-field-symbol struct1 struct1-field1) -> field1
 (define (get-field-symbol basename getter)
   (with-symbol-names (basename getter)
     (let ((rx (regexp (string-append basename "-"))))
       (string->symbol (regexp-replace rx getter "")))))

 ; Генерим пары (имя-поля значение-поля)
 (define (get-fields stx sval getters constructor)
   (datum->syntax stx
     (for/list ((getter (syntax->list getters)))
       `(,(get-field-symbol constructor getter) (,getter ,sval)))))
 )

(define-syntax (with-struct stx)
  (syntax-case stx ()
    ((_ (sval : stype) -> body ...)
     (with-struct-info #'stype (info) ->
       (with-syntax (((_ constructor _ getters _ _) info))
         #`(let (#,@(get-fields stx #'sval #'getters #'constructor))
             body ...))))))

Вот такой простой говномакрос, практически без статических проверок на ошибки (кроме тех, которые Racket бесплатно генерит). В with-struct пришлось грубо сломать гигиену, чтобы ввести новые биндинги. Буду рад, если покажете, как это нужно по-человечески делать. Уверен, что несложно. Дальше сложнее будет.

Этот говномакрос работает:

(with-struct (my-str1 : str1) ->
  (print (list a b c))) ; (1 2 3)

(with-struct (my-str2 : str2) ->
  (print (list c d e))) ; (3 4 5)

Пишем match-struct:

(begin-for-syntax

 ; Генерация имени функции-предиката, соответствующего типу структуры
 ; Не придумал, как эту информацию доставать статически. В struct-info её нет
 ; (get-struct-predicate struct1) -> struct1?
 (define (get-struct-predicate basename)
   (with-symbol-names (basename)
     (string->symbol (string-append basename "?")))))

(define-syntax (match-struct stx)
  (syntax-case stx ()
    ((_ sval (stype -> action ...) . more)
     #`(if (#,(get-struct-predicate #'stype) sval)
           (with-struct (sval : stype) -> action ...) ; Упс
           (match-struct sval . more)))

    ((_ sval) #'#f)))

Упс. Мы в макросе используем другой макрос, который вводит свои биндинги. Мы _не знаем_, что это за биндинги (т.к. сами не заглядываем в стат. информацию), но эти биндинги должны попасть в «action ...». Как в этом случае будем красиво обходить гигиену? Есть какие-то хитрые синтакс трансформеры?

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

Экспромт (прошу воспринимать с юмором):

...ОБЕСПЕЧИТЬ ГИГИЕНУ

ПРИШЛО ВРЕМЯ ОБЕСПЕЧИТЬ ГИГИЕНУ
ГИГИЕНА САМА НЕ ОБЕСПЕЧИТСЯ
ТРАНСФОРМИРУЙ СИНТАКСИС, ТРАНСФОРМИРУЙ ЕГО ЕЩЕ РАЗ
ЗАЧЕМ МНЕ DEFMACRO, У МЕНЯ НЕТ ВРЕМЕНИ ЧТОБЫ ЕБАТЬСЯ С НИМ
ЛУЧШЕ ЕЩЕ РАЗ ОБЕСПЕЧИТЬ ГИГИЕНУ
Я ЗАНИМАЮСЬ ГИГИЕНОЙ ПО 3 РАЗА В ДЕНЬ
КАЖДЫЙ СЕАНС ЗАНИМАЕТ ДВАДЦАТЬ МИНУТ
Я ЖИВУ АКТИВНОЙ И ПОЛНОЦЕННОЙ ЖИЗНЬЮ
Я УСПЕШЕН, ПОЭТОМУ ЦЕЛЫЙ ДЕНЬ ЗАНИМАЮСЬ ГИГИЕНОЙ
А ПОСЛЕ ЭТОГО ПИШУ НА LINUX.ORG.RU
ТУПЫЕ ОБЩЕЛИСПЕРЫ ОДЕРЖИМЫ DEFMACRO
А Я СВОБОДНЫЙ ОТ DEFMACRO ЧЕЛОВЕК
СКАЧАТЬ БЕСПЛАТНО И БЕЗ РЕГИСТРАЦИИ МОКРЫЙ RACKET REFERENCE
КРЯК УЛЬТИМАТ КЕЙГЕН РАЗБЛОКИРУЙ MAYBE
SYNTAX-LOCAL-MAKE-DELTA-INTRODUCER LOCAL-TRANSFORMER-EXPAND/CAPTURE-LIFTS
(DATUM->SYNTAX (SYNTAX->DATUM (DATUM->SYNTAX (SYNTAX->DATUM helper-stx))))
ЛУЧШЕ Я ТРАНСФОРМИРУЮ СИНТАКСИС ЕЩЁ РАЗ
И ЗАБУДУ DEFMACRO, ОШИБКИ МНЕ НЕ НУЖНЫ
Я НЕ ЗАНИМАЛСЯ ГИГИЕНОЙ УЖЕ НЕДЕЛЮ
ПОЙДУ ЗАЙМУСЬ
В SYNTAX-CASE ВСЕ ПРОСТО И ПОНЯТНО
НУЖНО ТРАНСФОРМИРОВАТЬ СИНТАКСИС. ЭТО ЖЕ ОЧЕВИДНО КАК ЭТО РЕШИТЬ
ПРИШЛО ВРЕМЯ ОБЕСПЕЧИТЬ ГИГИЕНУ
КОКОКОКОКОКОКО
(syntax-parse #'1 2) -> readline-input::236: ?: bad syntax in: 2
КОКОКОКОКОКОКО
mrm
()
Ответ на: комментарий от anonymous

В защиту кодволкеров, простой макрос из «Let over Lambda»:

(defmacro with-all-cxrs (&rest forms)
  `(labels
     (,@(mapcar
          (lambda (s)
            `(,s (l)
               (cxr ,(cxr-symbol-to-cxr-list s)
                    l)))
          (remove-duplicates
            (remove-if-not
              #'cxr-symbol-p
              (flatten forms)))))
     ,@forms))

Пример использования:

* (macroexpand
   '(with-all-cxrs
      (cons
        (cadadadr list)
        (caaaaaaaar list))))

(LABELS
  ((CADADADR (L)
     (CXR (1 A 1 D 1 A 1 D 1 A 1 D) L))
   (CAAAAAAAAR (L)
     (CXR (1 A 1 A 1 A 1 A 1 A 1 A 1 A 1 A) L)))
  (CONS
    (CADADADR LIST)
    (CAAAAAAAAR LIST)))
T

Как вы такое без кодволкеров сделаете? Где возьмёте необходимую статическую информацию о функциях, использованных внутри лексического контекста? Нет такой готовой фичи в макросистеме? Будем жаловаться в багтрекер и ждать следующего релиза?

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

mrm, ставлю на анонимного троля - твой выше всяких похвал лаконичный и логичный посыл не сподвигнет его на конструктив. Но попытаться стоит, ибо даже если твои вопросы останутся «гласом вопиющего в пустыне», поступок твой зело люб ;)

Это не тролль. Конструктива он уже достаточно привёл, даже программы показал (чего не скажешь о коммонлисперах). Другое дело, что существуют вопросы, природу которых мы пока очень плохо понимаем.

Например, мы пока мало что знаем про то, почему у разных людей отличается «совместимость» с различными подходами и концепциями. Мы не знаем, почему некоторые люди становятся хаскельщиками, некоторые — лисперами, а некоторые молятся на php. Только по историческим причинам (воздействием окружающей среды)? Или же есть прямая связь с типом личности?

Это важные вопросы, они меня давно интересуют.

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

Это важные вопросы, они меня давно интересуют.

Все очень просто: высокоуровневое программирование - гуманитарная дисциплина, сродни математике, лингвистике и писательскому делу, и требует соответственно от программиста наличия литературного вкуса, внезапно да. Чей-то уровень дарьядонцова (пхп), кто-то читается восторженный хайп-треш (руби), другой классицист-натуралист скептик (питон), иной пидарствующий эстет-эссетист (хаскель), лисп выбирают, по моему наблюдению, люди склонные к творческому разнообразию и произвольной компиляции стилей под философским соусом - этакий постмодернизм на метамфитаминах - от депрессивных и развязанных defmacro, до элегантных и эластичных функциональных декомпозиций в шекспировском эмплуа. Perl-поклонники, наверняка, какие-нибудь почитатели творчества Джеймса Джойса, а java-программисты скрытые Маркиза де Сады с его анальной акробатикой и наслаждением от произвольного саздизма.

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

Это важные вопросы, они меня давно интересуют.

Шенк давно всё объяснил. Если вкратце - дело в отношении к дисциплине. Чем больше симпатия к хаосу, тем больше людям нравятся языки типа CL.

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

что в окамле получается проще делать, чем в CL?

Только то, где нужны фичи ML: мощная статическая система типов, ADT, система модулей в стиле SML, pattern-matching, хорошо интегрированный с фичами системы типов. Когда эти фичи не нужны (или сгодятся наколенные хаки), то и OCaml не нужен.

Например, всё это может понадобиться при разработке компиляторов, тем более, что экосистема Окамла к этому распологает (есть готовые компиляторы, системы стат. анализа, куча крутых и проверенных временем библиотек типа CIL, OCamlGraph, биндингов к LLVM, всяческих генераторов парсеров).

Да, можно всё это и поверх лиспа накрутить. Например, в Typed Racket есть все эти фичи и некоторые другие, но работает это не так гладко, как в OCaml: компилятор медленный, сообщения об ошибках плохие, баги попадаются, примеров кода (и готовых проектов) практически нет. Сам дизайн языка ещё практикой не проверен. Хотя штука, мне кажется, перспективная и интересная.

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

OCaml можно прямо сейчас брать и использовать. В реализацию вложено больше 20 лет труда крутых дядек из INRIA. Он работает, как часы. Годный строгий диалект ML. Тупой, как дрова, с предельно простым компилятором и предельно простым рантаймом (с содроганием вспоминаю GHC).

Плюс реализации — маленький, пригодный для встраивания рантайм. Один из моих недавних проектов — компилятор, встроенный в огромную коробочную legacy софтину на Delphi7. Он подрубается к системе в виде обычной виндовой DLL.

Главный, как мне кажется, минус Окамла — отутствие простой в использовании макросистемы. Camlp4 — очень сложный в использовании и крайне плохо документированный инструмент, который по возможностям в подмётки не годится самым тупым лисповским макросам. Для того, чтобы что-то нетривиальное начать делать на Camlp4, нужно как минимум исходники его прочитать (их немного, но это ад из функторов). Обычно использование Camlp4 оправдано только для крупных синтаксических расширений. В остальных случаях это откровенная стрельба из пушки по воробъям. Композабельные макры делать практически невозможно. Макросы, генерящие макросы, практически невозможны (чреваты баттхертом при отладке и усложнением системы сборки).

Собственно, макросистема — единственная фича, которая меня сейчас привлекает в лиспах, манит неудержимо. Если бы её не было — нахер бы мне не сдалось это убогое скобчатое говно. Извиняюсь :-)

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

В typed racket действительно не все так гладко, но он сам молодой и постоянно эволюционирует.

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

Это не тролль.

Это не имеет значения ;)

И, всё-же, подождём его реакции на твои вопросы

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

что в окамле получается проще делать, чем в CL?

Бинарники. Маленькие, быстрые бинарники.

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

В with-struct пришлось грубо сломать гигиену, чтобы ввести новые биндинги. Буду рад, если покажете, как это нужно по-человечески делать.

В общем, обход через datum->syntax - это нормально. Только лучше вешать гигиену именно на те символы, что хотите из под нее вывести и не вешать на скобки - это во-первых, во-вторых, надо понимать, что вы берете контекст у stx.

А у вас сами геттеры из-под гигиены вылетели. То есть если они будут перекрыты в текущем скопе, то работать ничего не будет.

; Генерация имени функции-предиката, соответствующего типу структуры
; Не придумал, как эту информацию доставать статически. В struct-info её нет
; (get-struct-predicate struct1) -> struct1?

Есть. Третий элемент struct-info и есть этот предикат.

Еще момент - если хотите в паттерне стрелочки и двоеточия, то в define-simple-macro надо окружать их ~datum: (~datum ->) например.

Как в этом случае будем красиво обходить гигиену?

ага, это как раз то о чем я говорил - контекст взят у stx, а оно сгенерировано внутри макроса (и задвинуто под гигиену), в результате не пересекается с нужными нам идентификаторами. Можно вывести из-под гигиены скобки, но тогда надо будет выводить все потенциальные вызовы внутреннего макроса. Лучше переписать немного сам макрос (а конкретно тот код, который выводит из-под гигиены имя поля):

 (define (get-fields stx sval getters constructor)
   (for/list ((getter (syntax->list getters)))
     #`(#,(syntax-local-introduce (datum->syntax #f (get-field-symbol constructor getter))) (#,getter #,sval))))
Теперь все работает.

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

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

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

Соответственно, с практикой неудобство пройдет.

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

В защиту кодволкеров, простой макрос из «Let over Lambda»:

И вот возникает вопрос - что будет если у нас некоторый макрос раскрывается в cadadadr? Или cadadadar не стоит в expr-позиции? Или переопределен let'ом? Кодеволкер этого не заметит, нужный биндинг не введет, hur-dur, жопу разорвало. Вообще, да, именно вот такая схема (когда внутри макроса может быть произвольный биндинг, который ВНЕЗАПНО надо как-то раскрыть в зависимости от контекста, при чем конкретное имя неизвестно) вызывает некоторые проблемы. Ну в racket можно выебнуться, переопределив #%app или #%top, что снимет большинство проблем, но не будет работать тогда, когда соответствующий идентификатор уже определен. Еще можно сделать local-expand, оттуда вытащить все идентификаторы нужного вида с нужными связываниями (тем же кодеволкером, но на раскрытом коде), потом сгенерить код-обертку и воткнуть внутрь оригинал - но во-первых у макросов могут быть сайд-эффекты, а экспанд будет производиться несколько раз одних и тех же форм - что нарушит консистентность, а во-вторых при вложении форм друг в друга время экспанда будет расти квадратично с уровнем вложенности. Кроче - глобалнього, надежного решения такой проблемы нет, так что подобных макросов следует избегать.

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

А мне связывание по месту вызова кажется более естественным, т.к. это концептуально проще.

Потому что вы так привыкли :) Концептуально проще связывание по месту определения, т.к. так связываются _функции_. Чем концептуально проще тот факт, что макросы имеют какие-то свои, особенные, правила связывания? :)

Паттерн матчеры, list comprehensions, генераторы визиторов — очень полезные инструменты. Только к гигиене это никакого отношения не имеет. Никто не мешает подобные инструменты использовать в defmacro.

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

Например, отсутствие гигиены могло бы в некоторых случаях значительно усложнить использование того же syntax-parse.

Для меня сейчас неочевидно, что использование гигенических систем оправдывает себя во всех возможных случаях. Я вижу, что гигена часто создаёт ментальный оверхед при создании макроса, облегчая при этом оверхед от его использования; при этом я не уверен, что упрощение использования всегда перевешивает усложнение написания.

Вопрос привычки. Мне наоборот гигиена позволяет не задумываться о корректности макроса - а описывать его логику и it just works. То есть на практике я когда макрос пишу, то не думаю о том, что «ага здесь будет гигиена, а потому этот юзкейс корректен». Я просто знаю, что все будет хорошо и даже не вспоминаю об этих вещах. Уже тот факт, что втыкать генсим надо намного чаще, чем обходить гигиену, говорит о том, что дефмакро ментально дает больший оверхед.

Почему вы думаете, что не хочу?

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

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

Да, можно всё это и поверх лиспа накрутить. Например, в Typed Racket есть все эти фичи и некоторые другие, но работает это не так гладко, как в OCaml: компилятор медленный, сообщения об ошибках плохие, баги попадаются, примеров кода (и готовых проектов) практически нет. Сам дизайн языка ещё практикой не проверен. Хотя штука, мне кажется, перспективная и интересная.

Надо отметить, что Typed Racket существует год-два от силы.

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

Я сейчас попытался написать в Racket игрушечный матчер, умеющий использовать статическую информацию о типах структур. Сразу столкнулся с несколькими моментами, в которых нужно ломать гигиену, и «изящного гигиенического» решения для которых я не придумал (хотя доки долго копал).

Там ее в одном единственном месте надо обходить. И легко обходится. Тут все дело в том, что надо просто знать как работает алгоритм гигиены (или, более конкретно, - как происходит связывание идентификаторов в присутствии гигиены). Тогда вопрос как именно надо обойти гигиену в том или ином месте становится тривиальным. Ну за исключением, наверное, каких-то совсем уж замудренных случаев, которые мне и представить-то сложно. Без обхода гигиены код был бы проще ровно на один вызов syntax-local-introduce и один вызов datum->syntax. Вообще, кстати, можно написать что-нибудь типа такого:

(begin-for-syntax 
  (define-syntax-class unmarked
    (pattern x:expr
             #:with v (syntax-local-introduce #'x))))

(define-simple-macro (test (values ...) body ...)
  #:with (id:unmarked ...) #'(a b c)
  (let ([id.v values] ...) body ...))

(test (1 2 3) (list a b c))
->
'(1 2 3)
то есть соответствующий syntax-class автоматом из-под гигиены выводит. Можно и для datum->syntax аналогичный написать.

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

гуманитарная дисциплина, сродни математике

Настолько тонко, что никто и не заметил. Да в этом итт треде одни анорексики собрались, лол.

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

Гуманитарные науки изучают человека, его поведение, поступки и высеры. Математика сюда не относится.

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

вы долго использовали дефмакро, этот инструмент стал для вас удобен

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

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

И вот возникает вопрос - что будет если у нас некоторый макрос раскрывается в cadadadr?

макрос развернётся в лисп код

Или cadadadar не стоит в expr-позиции? Или переопределен let'ом?

в лисп-2 ничего не будет.

Кодеволкер этого не заметит, нужный биндинг не введет

это не кодволкер, если даже макры раскрыть не может.

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

Гуманитарные науки изучают человека, его поведение, поступки и высеры. Математика сюда не относится.

Математика во-первых - не наука. Во вторых - лингвистическая гуманитарщина, которую мы просто «взяли и придумали» из-за недостатка способа передачи неких абстракций (самими абстракциями она, кстати, тоже занимается весьма в ограниченном режиме - ну, т.е. не является средством их создания, только манипуляции, создает абстракции человеческий разум - таким образом: если научная дисциплина описывает окружающие нас физические процессы, то математика - создает способ описания абстракций, абстрактной информации - придавая ей значение в зависимости от контекста и выдуманных правил интерпретации, математическая эмпирика - это Знание). И поэтому, в частности, математика выступает предметом ее (лингвистики) изучения. Зачем-то лингвистику математического языка скрестили с ужом^W философией и ежом^W логикой (другой гуманитарной дисциплиной - разделом хуйпоймичег^W то ли математики, то ли философии) - и назвали метаматематикой. Чем эта мемаматематика отличается от обычной беседы математиков на философские темы в LSD-трипе, тоже сходу не поймешь. А так, достаточно весело читать, как программистов называют «технарями», когда все базовые дисциплины (даже не науки) у них гуманитарные: математика, лингвистика, логика (а корни логики в этике) и философия.

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

Слушай, да ты просто мастер вброса! Уже третий годный только в этом треде!

//я тебя запомнил

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

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

Макросы схемы - это та же схема. Не говори того, о чем не знаешь.

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

макрос развернётся в лисп код

И его результат обработан не будет. То есть ошибка.

в лисп-2 ничего не будет.

Хорошо, переопределен flet'ом.

это не кодволкер, если даже макры раскрыть не может.

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

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

Все гораздо проще. Вот смотри:

Гуманитарные науки изучают человека, его поведение, поступки и высеры. Математика сюда не относится.

Математика изучает идеальные объекты, которые не существуют в реальном мире, а существуют только в человеческом воображении, то есть являются результатом человеческой деятельности = высером человека. Что есть по определению гуманитарная наука.

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

Математика изучает идеальные объекты, которые не существуют в реальном мире, а существуют только в человеческом воображении, то есть являются результатом человеческой деятельности = высером человека. Что есть по определению гуманитарная наука.

Математика - язык науки, а не наука. В вышеупомянутой лингвистике (гуманитарной науке) используется он же.

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

Извиняюсь за задержку с ответом. Погрузился в работу с головой.

Есть. Третий элемент struct-info и есть этот предикат.

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

Еще момент - если хотите в паттерне стрелочки и двоеточия, то в define-simple-macro надо окружать их ~datum: (~datum ->) например.

Спасибо, работает. А в syntax-case подобное можно делать или же тут уже syntax-parse понадобится?

ага, это как раз то о чем я говорил - контекст взят у stx, а оно сгенерировано внутри макроса (и задвинуто под гигиену), в результате не пересекается с нужными нам идентификаторами. Можно вывести из-под гигиены скобки, но тогда надо будет выводить все потенциальные вызовы внутреннего макроса.

т.е. если ломать гигиену простым способом (с datum->syntax или defmacro), то с композабельностью всё хреново становится. И если я хочу делать простые макросы-кирпичики, то я обречён обходить гигиену при помощи относительно тяжеловесных способов.

Теперь я понимаю вашу фразу: «Вообще написание дслей через \„кирпичики\“ хоть и дает определенные преимущества, но и значительно повышает сложность написания». Очевидно, что с таким подходом оверхед от гигиены становится более ощутимым.

Вообще, кстати, можно написать что-нибудь типа такого:

(begin-for-syntax (define-syntax-class unmarked (pattern x:expr #:with v (syntax-local-introduce #'x))))

(define-simple-macro (test (values ...) body ...) #:with (id:unmarked ...) #'(a b c) (let ([id.v values] ...) body ...))

(test (1 2 3) (list a b c)) -> '(1 2 3)

то есть соответствующий syntax-class автоматом из-под гигиены выводит. Можно и для datum->syntax аналогичный написать.

Этим механизмом мне пока пользоваться не приходилось. Вижу, что он может помочь с сокращением boilerplate во многих типичных случаях. Возьму на вооружение.

А мне связывание по месту вызова кажется более естественным, т.к. это концептуально проще.

Потому что вы так привыкли :) Концептуально проще связывание по месту определения, т.к. так связываются _функции_. Чем концептуально проще тот факт, что макросы имеют какие-то свои, особенные, правила связывания? :)

Функции и defmacro — предельно простые штуки. Как отвёртка и молоток. При этом семантика у них настолько разная, что я не вижу смысла делать их похожими друг на друга. Это простые инструменты, использование которых несложно совмещать.

Гигиенические же макросы, на фоне этих инструментов, — как сиреневенькая глазовыколупывательница. Прочитав инструкцию, можно понять, что при помощи неё реально вбить гвоздь: для этого нужно слегка придавить кнопку X, удерживая которую повернуть на 18 градусов рычажок Y и, установив прибор параллельно уровню моря (антенной на юг), нежным вращательным движением против часовой стрелки погрузить специально подготовленный гвоздь в отверстие Z (шляпкой вниз).

Для меня сейчас неочевидно, что использование гигенических систем оправдывает себя во всех возможных случаях. Я вижу, что гигена часто создаёт ментальный оверхед при создании макроса, облегчая при этом оверхед от его использования; при этом я не уверен, что упрощение использования всегда перевешивает усложнение написания.

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

Я вот тоже часто _знаю_, что всё будет хорошо и при использовании простого defmacro, т.к. доверяю своей интуиции, вижу, что на практике проблем не возникнет. Например, with-all-cxrs — очень простой макрос, по поводу надёжности которого я бы не волновался. Об этом ещё подробнее напишу.

Вообще, я давно за собой заметил, что чем тупее инструмент, тем легче мне даётся продумывание того, каким же образом его можно использовать. Когда есть набор базовых, «фундаментальных» фич, то семантика этих фич с опытом получает аппаратную мозговую поддержку, заметно усиливающую общую эффективность использования инструмента.

Аппаратная поддержка для сложных, замороченных языков общего назначения типа C++ или перла вырабатывается только с годами активного использования и только у очень особенных людей (типа моего олимпиадного друга, который больше 10 лет решает контесты на плюсах, и у которого часто программы просто «работают, если компилируются»).

А для простейших DSL, например, аппаратное ускорение может вырабатываться почти моментально. Чем проще семантика DSL — тем быстрее. Поэтому я убеждён, что метапрограммирование — очень перспективный подход.

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

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

Соответственно, с практикой неудобство пройдет.

Не факт.

Есть подходы и инструменты, неудобство которых я так и не преодолел. Например, трансформеры монад в Хаскелле, использование шаблонов C++ в стиле Александреску, суровое энтерпрайз-ООП, пестрящее модными паттернами. Всё это не работает для меня, сколько бы времени я в это не вкладывал и сколько бы не слушал адептов этих подходов, твердящих, что с практикой всё будет хорошо и просто получаться.

У меня есть свой judgement и своя интуиция, которым я с опытом доверяю всё больше и больше, потому как если этого не делать, то можно очень много времени потратить впустую или почти впустую.

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

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

По поводу простейшего макроса with-all-cxrs:

Еще можно сделать local-expand, оттуда вытащить все идентификаторы нужного вида с нужными связываниями (тем же кодеволкером, но на раскрытом коде), потом сгенерить код-обертку и воткнуть внутрь оригинал - но во-первых у макросов могут быть сайд-эффекты, а экспанд будет производиться несколько раз одних и тех же форм - что нарушит консистентность, а во-вторых при вложении форм друг в друга время экспанда будет расти квадратично с уровнем вложенности. Кроче - глобалнього, надежного решения такой проблемы нет, так что подобных макросов следует избегать.

И вот возникает вопрос - что будет если у нас некоторый макрос раскрывается в cadadadr?

Ничего не будет. Меня устроит, если c(a|d)+r будут генериться только для того кода, который я глазами вижу в текстовом редакторе внутри with-all-cxrs. Не нужно внутри такого макроса делать дополнительных макроэкспандов, он по дизайну такой.

Или cadadadar не стоит в expr-позиции?

Пофиг. Мы тупо делаем flatten для всего кода и рассматриваем сразу все символы. Если пара функций лишних сгенерится — не страшно.

Или переопределен let'ом? Кодеволкер этого не заметит, нужный биндинг не введет, hur-dur, жопу разорвало.

Ну и зачем кому-то может понадобится биндить что-то на c(a|d)+r, если оно не будет работать как c(a|d)+r? Мы уже большие мальчики и можем, подумав головой, взять на себя ответственность за использование на практике такого макроса (пусть он в теории и ни на что не годится). Это же _очевидно_, что такой проблемы на практике не возникнет и никакая гигиена или система типов меня не переубедит.

Как сказал по радио Кими Райкконен, побеждая в недавнем Гран-при Формулы 1: «Just leave me alone, I know what I'm doing».

Вообще, да, именно вот такая схема (когда внутри макроса может быть произвольный биндинг, который ВНЕЗАПНО надо как-то раскрыть в зависимости от контекста, при чем конкретное имя неизвестно) вызывает некоторые проблемы. Ну в racket можно выебнуться, переопределив #%app или #%top, что снимет большинство проблем, но не будет работать тогда, когда соответствующий идентификатор уже определен.

А с defmacro всё будет работать. Ещё раз — на практике _не будет_ никаких проблем с перекрывающимися биндингами, т.к. любой c(a|d)+r будет работать как c(a|d)+r, независимо от места определения.

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

Хотя бывает и так, что программист сначала один раз основательно головой подумает над решением задачи, а потом ему приходится ещё в 10 раз дольше думать над тем, как обойти ограничения, навязываемые инструментом. Мне с Delphi7 таким образом регулярно трахаться приходится. И, поверьте мне, это не синдром утёнка.

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

Плюсы решают в алгоритмических задачах, достаточно посмотреть на всякие там рейтинги.

Худо-бедная высокоуровневость, скорость и наличие килотонн готовых структур данных делают свое дело.

Плюсы используются олимпиадниками потому, что на финале ACM ICPC можно использовать только Java и C++. Когда можно было использовать Паскаль, очень многие российские олимпиадники использовали Паскаль.

Впрочем, один из сильнейших олимпиадных программистов современности, беларусский школьник Геннадий Короткевич, висящий на 1 месте в куче рейтингов, использует Delphi всегда, когда есть такая возможность. И все нужные структуры и алгоритмы на коленке по надобности кодит. Даже всякие дебильные сортировки, которых в Делфи встроенных нет :-)

Вообще, олимпиадное программирование — очень специфичная штука, имеющая весьма отдалённое отношение к задачам, возникающим «у обычных пацанов» в реальном мире.

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

Мой друг способен закодить и объяснить почти всё из этого списка: http://e-maxx.ru/algo/ и многое из этого на моих глазах кодил, причём узким местом была скорость печати. Типичный выпускник CS-специальности российского вуза вряд ли краем уха слышал и про десятую часть этих вещей.

К сожалению, в работе всё это моему другу не помогает. Он кодит тупые прикладные модули на Делфи7 и ковыряет легаси. Надо его в в какой-нибудь Google пропихнуть :-)

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

Странно, что нет информации о полях; тогда бы не понадобился хак с выдиранием имени поля из имени аксессора.

Так и самих полей ведь нет :)

А в syntax-case подобное можно делать или же тут уже syntax-parse понадобится?

В syntax-case можно добавить нужные символы в скобки перед паттернами:

(syntax-case stx (-> :) ...), проблема только в том, что это не аналог ~datum а аналог ~literal в syntax-parse, то есть проверка на равенство идет как сравнение _идентификаторов_ а не символов.

т.е. если ломать гигиену простым способом (с datum->syntax или defmacro), то с композабельностью всё хреново становится.

Нет, здесь все дело в том, как работает syntax->datum. он и не обходит гигиену в прямом смысле этого слова - он меняет контекст. Но поскольку в макросе мы имеем лишь контекст выражения и его кусков - то любого другого контекста там какбы нет. И значит взять его мы не можем. Другое дело что во многих ситуациях нам именно такое поведение и требуется (замыкание именно на нужный контекст, а не вывод из-под гигиены).

И если я хочу делать простые макросы-кирпичики, то я обречён обходить гигиену при помощи относительно тяжеловесных способов.

Ну, я бы не назвал применение syntax-local-introduce более тяжеловесным :) Скорее, наоборот. Ну и это надо только для анафорических макросов (которые встречаются редко, вообще говоря).

Теперь я понимаю вашу фразу: «Вообще написание дслей через \„кирпичики\“ хоть и дает определенные преимущества, но и значительно повышает сложность написания». Очевидно, что с таким подходом оверхед от гигиены становится более ощутимым.

Неправильно :)

На «кирпичиках» выше оверхед от того, что мы работаем с макросами (макросы - штука менее композабельная, чем функции, by-design). И от отсутствия гигиены тоже оверхед выше.

Функции и defmacro — предельно простые штуки. Как отвёртка и молоток. При этом семантика у них настолько разная, что я не вижу смысла делать их похожими друг на друга.

А зачем все усложнять и делать семантику дефмакро сильно отличной от семантики defun? :)

Прочитав инструкцию, можно понять, что при помощи неё реально вбить гвоздь: для этого нужно слегка придавить кнопку X, удерживая которую повернуть на 18 градусов рычажок Y и, установив прибор параллельно уровню моря (антенной на юг), нежным вращательным движением против часовой стрелки погрузить специально подготовленный гвоздь в отверстие Z (шляпкой вниз).

практика показывает, что 99% гвоздей вбиваются, как минимум, не сложнее чем при помощи дефмакро :)

Я вот тоже часто _знаю_, что всё будет хорошо и при использовании простого defmacro, т.к. доверяю своей интуиции, вижу, что на практике проблем не возникнет. Например, with-all-cxrs — очень простой макрос, по поводу надёжности которого я бы не волновался.

Но этот макрос некорректен. Вот вам пример того, как ваша интуиция дает сбой.

Когда есть набор базовых, «фундаментальных» фич, то семантика этих фич с опытом получает аппаратную мозговую поддержку, заметно усиливающую общую эффективность использования инструмента.

Как я и говорил - дело привычки.

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

Ничего не будет. Меня устроит, если c(a|d)+r будут генериться только для того кода, который я глазами вижу в текстовом редакторе внутри with-all-cxrs. Не нужно внутри такого макроса делать дополнительных макроэкспандов, он по дизайну такой.

А если, опять же, у вас некоторый макрос раскрывается в with-all-cxrs? Объявлять баг фичей - это не слишком правильно. Баг он и есть баг. В любом случае, если такие использования макроса некорректны, то в их случае макрос должен давать соответствующую ошибку типа «не могу использоваться внутри макроса» или «идентификатор пришел из макроса» и т.п.

Пофиг. Мы тупо делаем flatten для всего кода и рассматриваем сразу все символы. Если пара функций лишних сгенерится — не страшно.

Так этот макрос переопределит нам этот символ, хотя не должен был переопределять.

Это же _очевидно_, что такой проблемы на практике не возникнет

сказал сишник перед тем как словить сегфаулт :)

А с defmacro всё будет работать.

Нет, вы не поняли. С гигиеной можно сделать решение которое даже корректнее дефмакро, но и оно работать не будет (будет глючное). А с дефмакро вообще ад и содомия :)

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

В том и проблема что у программиста без гигиены НЕТ НИКАКОГО КОНТРОЛЯ. Дебил он , не дебил - он просто не знает, что в макросе Х происходит одна хуйня (макрос раскрывается в with-all-cxrs), а в макросе Y - другая, в результате чего вместе использовать эти макросы нельзя. Или у вас какой-нибудь макрос with-all-logged, который врапает стоящие в head-позиции идентификаторы кодом логгирования, например, а ваш макрос хуяк - и переопределяет все внутри. А еще вы забываете про такую банальную вещь, что вам макрос могут передать в макрос. И тут вообще начинается полная пизда.

Хотя бывает и так, что программист сначала один раз основательно головой подумает над решением задачи, а потом ему приходится ещё в 10 раз дольше думать над тем, как обойти ограничения, навязываемые инструментом.

Я просто не знаю где и какие вы нашли ограничения. Во всех примерах из этого треда гигиена обходилась применением одной единственной функции - либо datum->syntax, либо syntax-local-introduce. И решение было длиннее дефмакровского ровно на применение этой ф-и. Я, право, не считаю применение одной ф-и на сотню строк кода каким-то хоть сколько-нибудь значимым ограничением или усложнением.

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

Когда есть набор базовых, «фундаментальных» фич, то семантика этих фич с опытом получает аппаратную мозговую поддержку, заметно усиливающую общую эффективность использования инструмента.

Как я и говорил - дело привычки.

Хотя бывает и так, что программист сначала один раз основательно головой подумает над решением задачи, а потом ему приходится ещё в 10 раз дольше думать над тем, как обойти ограничения, навязываемые инструментом.

Я просто не знаю где и какие вы нашли ограничения. Во всех примерах из этого треда гигиена обходилась применением одной единственной функции - либо datum->syntax, либо syntax-local-introduce. И решение было длиннее дефмакровского ровно на применение этой ф-и. Я, право, не считаю применение одной ф-и на сотню строк кода каким-то хоть сколько-нибудь значимым ограничением или усложнением.

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

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

С Лиспом та же история: базовые возможности осваиваются моментально, после чего остаётся думать над тем, каким образом можно эти возможности использовать.

Макросы Racket, по сравнению с Фортом и Лиспом — очень сложная хреновина, для эффективного использования которой нужно знать про множество мелких фич, позволяющих решать проблемы в конкретных случаях.

Хотя, возможно, это один из тех случаев, когда сложная проблема требует сложного решения. Я не видел системы метапрограммирования, в которой решались бы проще проблемы, решаемые макросами Racket. Другой вопрос — стоит ли овчинка выделки? И на этот вопрос мне даст ответ только личный опыт.

Ничего не будет. Меня устроит, если c(a|d)+r будут генериться только для того кода, который я глазами вижу в текстовом редакторе внутри with-all-cxrs. Не нужно внутри такого макроса делать дополнительных макроэкспандов, он по дизайну такой.

А если, опять же, у вас некоторый макрос раскрывается в with-all-cxrs? Объявлять баг фичей - это не слишком правильно. Баг он и есть баг. В любом случае, если такие использования макроса некорректны, то в их случае макрос должен давать соответствующую ошибку типа «не могу использоваться внутри макроса» или «идентификатор пришел из макроса» и т.п.

Нет, вы не поняли. С гигиеной можно сделать решение которое даже корректнее дефмакро, но и оно работать не будет (будет глючное). А с дефмакро вообще ад и содомия :)

Пофиг. Мы тупо делаем flatten для всего кода и рассматриваем сразу все символы. Если пара функций лишних сгенерится — не страшно.

Так этот макрос переопределит нам этот символ, хотя не должен был переопределять.

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

Примеры вида "(flet ((cadadar () nil)) (with-all-cxrs ...))" прошу не приводить, т.к. случай с программистом-дебилом меня не интересует.

Это же _очевидно_, что такой проблемы на практике не возникнет

сказал сишник перед тем как словить сегфаулт :)

В том и проблема что у программиста без гигиены НЕТ НИКАКОГО КОНТРОЛЯ. Дебил он , не дебил - он просто не знает, что в макросе Х происходит одна хуйня (макрос раскрывается в with-all-cxrs), а в макросе Y - другая, в результате чего вместе использовать эти макросы нельзя. Или у вас какой-нибудь макрос with-all-logged, который врапает стоящие в head-позиции идентификаторы кодом логгирования, например, а ваш макрос хуяк - и переопределяет все внутри. А еще вы забываете про такую банальную вещь, что вам макрос могут передать в макрос. И тут вообще начинается полная пизда.

«В динамическом языке наша функция ожидала получить на вход корову, а получает письменный стол. Hur-dur, жопу разорвало».

«В Хаскелле мы всё православно пропихнём через монады, а в Окамле ваша хеш-таблица хуяк — и изменится в самый неподходящий момент».

«Говоря про безопасность на дорогах, вы забываете про такую банальную вещь, что могут разверзнуться хляби небесные и случится армагеддон. Не успеете перейти через дорогу, как раз — и вы уже горите в геене огненной. И тут вообще начинается полная пизда» :-)

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

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

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

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

спасибо, за ссылку, зопейсал, прорешаю все на ракетке.

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

А сами задачи нужно решать на специальных сайтах, позволяющих проверять решения в автоматическом режиме (прогоном невидимых тестов). Racket сейчас ни на одном из таких сайтов не поддерживается (есть только R5RS Scheme на spoj.pl). Впрочем, специфика типичных задач такова, что инструмент большого значения не имеет и даже на всяких Питонах и Руби можно сдавать задачи, если додуматься до алгоритма.

В некоторых случаях работают и не самые удачные решения, реализованные на «быстрых языках» типа C++ (решение «в лоб»). Но это скорее исключение из правил и до возможности решить задачу «в лоб» ещё додуматься надо (правильно оценить временную/пространственную сложность тупого решения в заданных ограничениях).

Есть замечательное ежегодное соревнование Google Code Jam (http://code.google.com/codejam/), в котором можно использовать вообще любые инструменты (в этом году я использовал OCaml и со скрежетом дошёл до второго тура, что является типичным результатом середнячка-любителя на фоне прочих машин формулы1, среди которых и школьников немало).

Вот пара очень сложных (и очень интересных) задач, каждую из которых я в течение нескольких дней по вечерам решал:

http://code.google.com/codejam/contest/1835486/dashboard#s=p3

http://code.google.com/codejam/contest/1842485/dashboard#s=p3

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

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

Дело не в строчках кода, а в ментальном оверхеде, возникающем при использовании более сложного инструмента.

А с чего вы взяли что инструмент более сложен? Он проще, вобщем-то.

Первый признак таких «проблемных» для меня подходов — интуитивная непонятность.

Так с какой стати вы решили, что ваши интуитивные представления об одном инструменте имеют что-то общее с совершенно другим инструментом? Естественно, что когда вы пытаетесь использовать новый инструмент, все ваши «интуитивные представления» должны быть забыты. Пока они не будут забыты вы новый инструмент использовать не сможете.

Макросы Racket, по сравнению с Фортом и Лиспом — очень сложная хреновина, для эффективного использования которой нужно знать про множество мелких фич, позволяющих решать проблемы в конкретных случаях.

Но вы ведь не делали попытки в них разобраться. Вот смотрите - я уже вам прямо заявил, что для того чтобы знать как где обходить гигиену и вообще чтобы понимать что происходит - вам надо узнать как работает в Racket алгоритм гигиены, а точнее - узнать как он влияет на установку биндингов. Вы прочитали эти пол страницы описания? Нет. А между тем алгоритм элементарен, и зная его вы знаете ровно все о поведении гигиены, всех хитрых трансформеров, мелких фич и всего прочего. Вам тогда станет понятно, что те ли иные особенности поведения - это не мелкие фичи, это просто результат того, что алгоритм вот именно такой и не другой. И зная алгоритм вам даже не надо читать доки - вы и так будете знать что там за фичи как они работают и почему. Вы прочитали, что syntax-local-introduce применяет к объекту синтаксическую метку текущего трансформера - и все, вы теперь знаете как что и когда будет перекрываться, в каком и где оно будет контексте и т.п.

«В динамическом языке наша функция ожидала получить на вход корову, а получает письменный стол. Hur-dur, жопу разорвало».

В динамическом языке у нас как раз есть контроль - например, мы можем написать код, который проверит входные данные на корректность и бросит исключение если что-то не так. А речь идет как раз об отсутствии контроля. Представьте, что вы пишите программу для решения квадратного уравнения, и у вас нет возможности сравнить с нулем коэффициент при x^2. Или нет, представьте, что это _для вас_ кто-то пишет такую программу, у него соответствующей возможности нету и в ответ на ваше закономерное недовольство (программа-то глючная выходит), вы в ответ слышите, что «ну просто она писалась не для идиотов, да» :)

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

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

да, отличная проверка.

А речь идет как раз об отсутствии контроля.

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

К слову, макросы CL могут принимать environment, только это никому не нужно. Доп. биндинги макросов, равно как кондишины или сайд эффекты форм должны быть просто отражены в документации. А полубредовые припарки схемы, которые естественно даже близко не решают указанные проблемы никому не нужны, поэтому схемовскими макросами никто не пользуется. Это из разряда монад и стрелок - тонны говнотеории, тонны говнокода и море ошибок.

схема - тупиковая ветвь развития.

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

Дебил он , не дебил - он просто не знает

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

в результате чего вместе использовать эти макросы нельзя

складывать строку со списком тоже нельзя, причём тут макросы?

А еще вы забываете про такую банальную вещь, что вам макрос могут передать в макрос

уже десятую страницу всех пугаешь. ну будет макрос внутри макроса и что? макроэкспард CL рекурсивно все раскроет. нет макросов схемы - нет и проблем.

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

контроля что ли схемовскими обфускационными макросами?

Опять какие-то сказки про обфускацию, противоречащие реальности. Если схемовские макросы - это блаблабла обфускация, почему код получается лаконичнее, функциональнее и в 10 раз короче?

ну, это не ошибки, а проблемы неполноценных макросов схемы, ведь семантика всегда полностью на совести автора

Вот именно. Гигиеническая система оставляет семантику на совесть автора - как автор захочет так и будет. А негигиеническое общеговно делает так как оно само захочет.

К слову, макросы CL могут принимать environment, только это никому не нужно.

Это нужно. Просто передача environment'a в CL сделана предельно уебищно. Да и функционала там никакого в этом environment'е.

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

То есть в документации надо всегда перечислять, например, какие анафорические макрос использовались при реализации? Охуенная идея, чо. Очень удобно, когда какой-нибудь макрос тебе вводит it - и не потому, что это надо, а просто потому что макросистема - говно, и иначе нельзя.

поэтому схемовскими макросами никто не пользуется.

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

схема - тупиковая ветвь развития.

Даже если считать это правдой - лучше тупик, чем деградация в стиле CL с контрамортами в качестве авторов стандарта.

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

макросы меняют семантику

Правильно. Макросы меняют семантику - в соответствии с документацией, в рамках своего функционала.

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

складывать строку со списком тоже нельзя, причём тут макросы?

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

уже десятую страницу всех пугаешь. ну будет макрос внутри макроса и что? макроэкспард CL рекурсивно все раскроет.

И это будет ошибка. Заебись.

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

Гигиеническая система оставляет семантику на совесть автора - как автор захочет так и будет. А негигиеническое общеговно делает так как оно само захочет.

да ну, несколько тупых синтаксических проверок биндингов ничего не дают.

чем деградация в стиле CL с контрамортами в качестве авторов стандарта

есть сбалансированное решение - CL, и решение где неоправданная сложность и несостыковка с остальным языком - макросы схемы.

Просто передача environment'a в CL сделана предельно уебищно. Да и функционала там никакого в этом environment'е.

тоже самое что в схеме.

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

Чем эта мемаматематика отличается от обычной беседы математиков на философские темы в LSD-трипе, тоже сходу не поймешь.

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

метаматематика занимается, в частности, изучением того, что может и не может быть доказано в рамках определенных логических систем; в частности, невозможность построения алгоритма для решения произвольного уравнения в целых числах и невозможность доказательства континуум-гипотезы и ее отрицания исходя из ZFC — это два типичных метаматематических результата

или вот метаматематический результат:

Оказалось, что существует непротиворечивая модель анализа, в которой бесконечно малые — корректно определённые числа, и с ними можно производить арифметические действия в духе Лейбница, без привлечения понятия предела. Тем самым была решена старая проблема: почему математики XVIII века, выполняя незаконные с точки зрения классической теории действия, тем не менее получали верные результаты.

И поэтому, в частности, математика выступает предметом ее (лингвистики) изучения.

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

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

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

Э-ка тебя батхертом распи$#сило :D

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

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

И поэтому, в частности, математика выступает предметом ее (лингвистики) изучения.

математику было бы весьма полезно поизучать почти-гуманитарно-лингвистически (т.е. грубо говоря, в аспекте понимания формул/формулировок человеком)

Безграмотность так и прет, не позорься - сходи просветись, чем лингвистика занимается.

но к метаматематике это никакого отношения не имеет

Что *это*, придурок? Объясняю просто - для дебилов: лингвистика изучает языки - математика это язык (набор языков, набор DSL).

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

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

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

математика это язык (набор языков, набор DSL)

Как с этим коррелирует то, что большая часть математики - это алгоритмы?

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

74.0300236517643716376%. Считай это сообщение пруфом.

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

Как с этим коррелирует то, что большая часть математики - это алгоритмы?

man определение «алгоритма», алгоритм - это описание порядка... блаблабла. Алгоритм - это описание.

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

Описание порядка чего-то. Алгоритм - это формальная запись, которая должна однозначно интерпретироваться и, в результате своего применения, обеспечивать заранее известный результат. Суть не в значках, суть в том, что значки обозначают. С некотрой точки зрения описательная работа (следует заметить, что формальная описательная работа, а не та фигня, которой историки страдают) не несёт в себе созидания, но, имхо, это не так.

По сути, чем отличается создание алгоритма решения квадратного уравнения от решения задачи создания динамита (не конкретной шашки, а технологии, которая позволяет делать динамитные шашки миллионами)? И там и там есть исходные данные в виде знаний, и там и там в качестве результата получаем алгоритм.

P.S. А что насчёт интегрального исчисления и решения Кеплером задачи измерения объёма «винной бочки» по её формальным параметрам (высоте, диаметру и т.п.), без применения физического эксперимента? Разве это не решение самой насущной естественной проблемы с помощью математики?

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

Описание порядка чего-то. Алгоритм - это формальная запись

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

Суть не в значках, суть в том, что значки обозначают.

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

Разве это не решение самой насущной естественной проблемы с помощью математики?

Все науки *используют* логику (какую-нибудь из них) и математику (мат.аппарат - какой-нибудь из них). Но ни математика, ни логика науками не являются.

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

Жж0ш.

Че? Алгебра логики и логика, задающая алгебру тупо неразличимы. Хочешь, назовем не логикой, а алгеброй жегалкина, но кроме логики в ней ничего и нет.

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

Описание порядка чего-то.

Порядка действий, событий, процессов. Алгоритм - по сути ОБС о том, как правильно варить борщ. Можем выразить борщ в математической нотации, а хочешь - через кузькину мать и улюлюканья. Рецепт борща = алгоритм по его приготовлению. Математики (которую ты подразумеваешь) там не видать.

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

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

Цитата прямо из википедии. Давай ты назовёшь конкретный момент, где математика не подходит под это определение (или приведи своё, но с точным указаним, где математика не подходит под определение науки), а потом продолжим.

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

Математики (которую ты подразумеваешь) там не видать.

А теперь давай возьмём числа (это чисто математические объекты, которые не существуют в физическом мире, но объективно необходимы для его описания) и алгоритмы над числами, например взятие квадратного корня от числа. Какая из наук должна заниматься вопросами работы с числами, свойствами чисел, синтезом новых чисел? Это первое.

Второе, если ты утверждаешь, что такая «наука» не наука вовсе, то чем она принципиально отличается от химии, которая так же должна описывать хим. элементы, их взаимодействия и давать понимание, как синтезировать новые хим. элементы?

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

Э-ка тебя батхертом распи$#сило

бугага!

картина маслом: alienclaster в комменте, полном эмоциональных слов и безуспешных, но отчаянных попыток эмоционально задеть www_linux_org_ru, убеждает окружающих, что баттхерт не у alienclaster-а, а именно у аккуратно выражающегося www_linux_org_ru :-)

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

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

что общепринято называется логической системой четко описано в википедии: A logical system or, for short, logic, is a formal system together with a form of semantics, usually in the form of model-theoretic interpretation, which assigns truth values to sentences of the formal language, that is, formulae that contain no free variables.

теперь твоя очередь — давай ссылку на общепринятое определение «логики жегалкина»

к остальным твоим смехотворным попыткам казаться умным или грамотным мы перейдем позднее — будем растягивать удовльствие :-)

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

А тебе зачем? Всякое определение/аксиоматика приводится не ради выпендрёжу, а для достижения определённой цели. И я ума не приложу для чего может понадобиться декларация «алгоритм это описание».

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

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

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

Че?

Формальная логика, булевская и «логика» Жегалкина - это три названия одной и той же логики. Не с твоим уровнем знаний троллить о математике.

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

Честно говоря, ты и до множественных батхертов был неинтересен, зачем тратить время на тебя сейчас - ума не приложу. С алгеброй Жегалкина мог бы ознакомиться самостоятельно либо в районе 1-го курса любой схемотехнической / математической кафедры.

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

математика не подходит под это определение

объективных знаний о действительности.

Вот здесь основная засада. Математика --- это язык:

а) на котором можно описать любые объекты, в том числе не имеющие с нашей дествительностью ничего общего;

б) никаких знаний не вырабатывает. Совсем.

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

тебе сбора фактов

2 + 2 будет 4? Площадь квадрата будет равна произведению его строн? Произведение a на b будет суммой b чисел a? Что ты скажешь о наблюдении о том, что диагональ квадрата есть число иррациональное? Чем это тебе не изучение «действительности»?

Понимаешь, ты и «с помощью» русского языка познаешь реальность, от этого наукой он не становится, ага.

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

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

Математика --- это язык

Я с этим не согласен. Соотв. все дальнейшие постулаты могут быть не верны.

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

P.S. В качестве примера подумай, как ты опишешь кучу зерна не имея чисел (задача в том, чтобы измерить её и понять, к примеру, на сколько её хватит, чтобы не сдохнуть с голоду).

Norgat ★★★★★
()
Последнее исправление: Norgat (всего исправлений: 3)
Ответ на: комментарий от alienclaster

С алгеброй Жегалкина мог бы ознакомиться самостоятельно либо в районе 1-го курса любой схемотехнической / математической кафедры.

напомню, ты писал о некой «логике жегалкина»; сейчас выясняется, что ты имел в виду алгебру жегалкина

идем дальше: под «булевой логикой» ты имел в виду булеву логику или же булеву алгебру?

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

Формальная логика, булевская и «логика» Жегалкина - это три названия одной и той же логики.

Не пори чушь, формальная логика - не обязательно бинарная. У алгебры Жегалкина в базисе только две операции - коньюнкция и xor, «обычной» дизъюнкции нет. Может уже хватит выставлять свою некомпетентность на показ?

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

Опять забыл про этот тред :-( Надеюсь, анонимный схемщик сюда ещё заглянет.

А с чего вы взяли что инструмент более сложен? Он проще, вобщем-то.

Вы сейчас говорите о том, что _вам_ легко _пользоваться_ этим инструментом :-)

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

Замечу, что никогда не говорил, что «гигиена — сложное говно, ну её нафиг, обойдусь как-нибудь». Я говорил, что это сложная штука, которую я пытаюсь освоить, несмотря на крайне негативные первые впечатления, т.к. есть шанс, что на практике от этого механизма и вправду будет толк (о чём много лет твердят разработчики Racket, которые кажутся вполне адекватными людьми).

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

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

Так с какой стати вы решили, что ваши интуитивные представления об одном инструменте имеют что-то общее с совершенно другим инструментом? Естественно, что когда вы пытаетесь использовать новый инструмент, все ваши «интуитивные представления» должны быть забыты. Пока они не будут забыты вы новый инструмент использовать не сможете.

При чём здесь другой инструмент? Когда я вижу простые вещи, то я вижу, что они простые. Нет, это не связано с тем, что мои закостеневшие мозги привыкли к другим подходам. Поверьте, я _всегда_ ищу способы посмотреть на вещи другими глазами, научиться делать что-то новым образом, победить закравшееся когнитивное искажение.

Языки программирования — интерфейс для людей. Они должны по максимуму использовать те «интуитивные представления», которые вы предлагаете выкинуть и без которых предлагаете начать с чистого листа. Потому что язык изменить гораздо проще, чем изменить человека.

Но вы ведь не делали попытки в них разобраться.

Опять домыслы. Конечно, если гигиена кажется кому-то сложной, то это обязательно или лентяй или дебил.

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

Я полностью прочитал и большей частью понял вот это: http://docs.racket-lang.org/reference/syntax-model.html. И мельком просмотрел вот это: http://docs.racket-lang.org/reference/Macros.html.

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

А между тем алгоритм элементарен, и зная его вы знаете ровно все о поведении гигиены, всех хитрых трансформеров, мелких фич и всего прочего. Вам тогда станет понятно, что те ли иные особенности поведения - это не мелкие фичи, это просто результат того, что алгоритм вот именно такой и не другой. И зная алгоритм вам даже не надо читать доки - вы и так будете знать что там за фичи как они работают и почему. Вы прочитали, что syntax-local-introduce применяет к объекту синтаксическую метку текущего трансформера - и все, вы теперь знаете как что и когда будет перекрываться, в каком и где оно будет контексте и т.п.

«Монады — элементарный механизм, и понимая его вы знаете ровно все о поведении монад, всех хитрых трансформеров, мелких фич и всего прочего. Вам тогда станет понятно, что те ли иные особенности поведения - это не мелкие фичи, это просто результат того, что механизм вот именно такой и не другой. И понимая механизм вам даже не надо читать доки — вы и так будете знать что там за фичи как они работают и почему. Вы прочитали, что Control.Monad.Trans.RWS комбинирует монады ReaderT, WriterT и StateT — и все, вы теперь знаете как что и когда будет лифтиться, биндиться, как будут вести себя монады в сочетании и т.п.» :-)

К слову, монады — действительно предельно простая штуковина. Только вот не могу я ими эффективно пользоваться, как ни пытался. Нет выработалось у меня аппаратной поддержки для монад, отторгает мой разум эту концепцию, неестественна она для меня. А для кого-то естественна. Люди разные бывают.

Не удивляйтесь тому, что многие лисперы находят гигиену неестественной. Не нужно думать, что никто из них даже не пытался её понять. Естественные концепции сами притягивают людей, поэтому многие пишут на ненавидимом вами (и недолюбливаемом мной) Common Lisp.

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

Внутри своей программы я делаю то, что захочу (если политика не мешает).

Хочу — динамическую типизацию использую. Не хочу, возникают ошибки — использую статическую.

Хочу — изменяемые состояния. Не хочу — пишу в функциональном стиле.

Хочу — глобальные переменные. Не хочу — не использую.

Хочу — использую goto. Хочу — computed goto.

Хочу defmacro — использую defmacro.

Хочу гигиену — использую гигиену.

Хочу препроцессор — использую препроцессор.

Программа работает — отлично. Не работает — делаю выводы.

В чём проблема вообще? :-)

Или нет, представьте, что это _для вас_ кто-то пишет такую программу, у него соответствующей возможности нету и в ответ на ваше закономерное недовольство (программа-то глючная выходит), вы в ответ слышите, что «ну просто она писалась не для идиотов, да» :)

Я писал выше:

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

А весь разговор, напомню, был о том, нужно ли выкидывать на свалку defmacro и полностью переходить на гигиенические системы. Напомню свою позицию — нет, нахрена себе что-то запрещать, если оно помогает решать задачу? Хочу defmacro — использую defmacro. Хочу забить гвоздь молотком — забиваю. Problem?

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

кстати, tailgunner постоянно идет на один шаг впереди меня в объяснении того, что у тебя явно не хватает знаний, чтобы троллить о (мета)математике, поэтому я переключусь на другой момент

Объясняю просто - для дебилов: лингвистика изучает языки - математика это язык (набор языков, набор DSL).

правильно, для дебилов — ибо только дебилы согласятся, что метаматематика сводится к лингвистике

лингвистика изучает (за очень немногими исключениями) то, каким образом можно строить высказывания (sentences); однако как математика, так и метаматематика рассматривают *дополнительно* к этому model-theoretic interpretation, which assigns truth values to sentences of the formal language

именно model-theoretic interpretation лежит за пределами лингвистики; более того, теорему геделя о неполноте можно трактовать как утверждение о нелингвистичности математики

я это пишу не столько для тебя, сколько для тех, кто будет эту ветку читать — ибо тебе все метаматематические доказательства, включая теорему геделя, кажутся lsd-трипом

короче — лечись, чувак!

www_linux_org_ru ★★★★★
()
Последнее исправление: www_linux_org_ru (всего исправлений: 1)
Ответ на: комментарий от Norgat

2 + 2 будет 4?

В какой системе исчисления? :D Это не факт еще раз, ку-ку

Площадь квадрата будет равна произведению его строн? Произведение a на b будет суммой b чисел a? Что ты скажешь о наблюдении о том, что диагональ квадрата есть число иррациональное? Чем это тебе не изучение «действительности»?

Смешно читать

Похоже ты банально не понимаешь

Дооо, конечно

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

Символы без контекста и определения *нихрена* не значит, это как азбука ацтеков. Т.е. математика - это именно такие символы и закорючки + их семантика.

Идея целых чисел, идея рациональных чисел, идея отрицательных чисел, конплексных, уравнений и т.д.

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

А символы... символы это лишь форма записи

Что в твоей математике есть кроме символов, отражающих неведомые незнакомому с ними абстракции, и логики?

(если бы не она, труды математиков были бы похлеще изречений в нашем законодательстве, а так получается (правда не всегда и не у всех) изъясняться понятней).

Ну, то есть математика - это такой удобный язык (для) описания науки. Мм-окей.

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

Ну, то есть математика - это такой удобный язык (для) описания науки. Мм-окей.

А языки изучает лингвистика. Значит, лингвистика изучает математику. Типичный ГСМ :)

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

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

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

А языки изучает лингвистика.

Это ее непосредственная задача и предназначение.

Значит, лингвистика изучает математику.

Должна была бы, да. Раздел лингвистики, изучающий непосредственно «математику» - обозвали метаматематикой.

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

Что в твоей математике есть кроме символов, отражающих неведомые незнакомому с ними абстракции, и логики?

Что есть в химии кроме описания химических элементов (аналог - описание чисел и их свойств) и их свойств, описания реакций (аналог - описание функций и алгоритмов над числами)? Я просто горю желанием увидеть пример того, чем «настоящая» естественная наука отличается от математики.

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

Раздел лингвистики, изучающий непосредственно «математику» - обозвали метаматематикой.

Боюсь, что не «обозвали», а «обозвал» %)

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

Что есть в химии кроме описания химических элементов

«Химические элементы» вообще изучает физика, а потом копипастится в химию, чтобы объяснять «откуда уши растут». Химия же, как наука, изучает химические *процессы*, а выросла она из алхимии: «плюнем сюда, добавим два хостика летучих мышей и цианида» - клево, получился йад :D

А яд - не абстракция, а реальность. Идем травить короля.

описания реакций (аналог - описание функций и алгоритмов над числами)

Общее между ними только описание %)

Я просто горю желанием увидеть пример того, чем «настоящая» естественная наука отличается от математики.

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

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

Боюсь, что не «обозвали», а «обозвал» %)

Как скажешь, ветеран :)

Да ладно бы один ветеран тебе это говорил %)

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

А яд - не абстракция, а реальность.

Яд - как раз абстракция. Реальность - это синильная кислота или там мышьяк.

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

Яд - как раз абстракция. Реальность - это синильная кислота или там мышьяк.

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

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

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

Это всё физические явления. Они просто есть, а фаерболов из пальца, к примеру, нет. Это не наука. Наука в том, чтобы описать их, узнать правила по которым эти процессы происходят и научиться предсказывать результат этих процессов при известных условиях, например.

Для тёмных людей, пример с интегрированием:

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

А тут бац и придумывают интегрирование и уже могут решать задачу измерения объёма бочки без переливания воды, круто да? А теперь представь не бочку, а кривую объёмную загогулину размером в несколько метров по всем направлениям и для неё нужно подсчитать площать, чтобы понять, а сколько металла на неё уйдёт. Расскажи, как ты тут без интегрирования справишься.

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

Norgat ★★★★★
()
Последнее исправление: Norgat (всего исправлений: 2)
Ответ на: комментарий от alienclaster

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

ну да, конечно, после того, как ты жидко обосрался, назвав алгебру жегалкина «логикой», тебе только и остается, что рассказывать про мою тупизну :-)

напомню твое предложение «этим [изучением того, что может и не может быть доказано в рамках определенных логических систем] занимается логика - формальная, булева, жегалкина, какаяугодно» ( Allegro CL 9.0 Free Express Edition стал доступен для загрузки (комментарий) )

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

так что ты не думаешь даже над тем, что пишешь

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

Ты попрощался? Я рад

да не в коем случае!

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

ну и да, могу окружающим кое-чего подсказать

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

Все определение противоречит сути математики - ни тебе сбора фактов, ни изучения «действительности»

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

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

хм кто то бы сказал что математика язык науки

а кто то другой как то сказал

математика - царица наук.

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

и те которые сейчас отличают физиков от лириков.

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

программисты технари ибо работают с устройством которое игнорирует ужимки и намёки

в отличии от тех же менеджеров :)

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

И получил абстракцию. Которую изучает токсикология %)

Токсикология - наука, в отличии от.

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

Это всё физические явления. Они просто есть

В этом и ключевое отличие - они есть, то, что изучает математика - его нет.

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

ну да, конечно, после того, как ты жидко обосрался, назвав алгебру жегалкина «логикой»

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

тебе только и остается, что рассказывать про мою тупизну :-)

Ее видно за версту, рассказы излишни

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

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

так что ты не думаешь даже над тем, что пишешь

Попробуй рефлексануть на эту тему

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

да забыты C-бои и ембедщики

На C пишут либо реальные (*nix-) хакеры, либо унылые задроты, для которых программирование это «тупо ремесло»: привычное, знакомое.

HDL пацаны с опытом и мозгами - генерируют, кто пишет на чистом - обычно «бывший электронщик», говнотехнарь из 80-х, мастодонт индустрии.

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

да. солнце воздух и вода наши лучшие друзья.

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

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

HDL пацаны с опытом и мозгами - генерируют

Блин, ну это не тред, а просто праздник открытий.

А здесь-то что не так?

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

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

ps. при том что и на java и на php есть высококрасный софт

эффект милиона лемингов .

как например сейчас трудно найти книгу этого века которая качественно описывало бы нюансы С . в отличия от перода 85-94? года когда был вал именно узкоспециализированной литературы на С.

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

HDL пацаны с опытом и мозгами - генерируют

Блин, ну это не тред, а просто праздник открытий.

А здесь-то что не так?

Да. Мои знакомые «пацаны с опытом и мозгами» вполне пишут на VHDL.

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

Да. Мои знакомые «пацаны с опытом и мозгами» вполне пишут на VHDL.

Это ж долго, вхеряченное туда недавно ооп картину лишь усугубляет.

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

Да. Мои знакомые «пацаны с опытом и мозгами» вполне пишут на VHDL.

Это ж долго

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

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от alienclaster

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

бугага

я все же попытаюсь тебе объяснить, почему тебя так смешно читать людям, хотя бы немного знающим математику

вот пример:

сколько тон клевера от каждой курицы-несушки заложено в инкубатор после обмолота зяби? (с) попугай

вот и ты разговариваешь так же, да еще с дикими понтами :-)

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

2. ну пусть ты вместо «логики жегалкина» хотел сказать «раздел математики, изучающий алгебру жегалкина» — но и тогда концы не сходятся, т.к. это тот же самый раздел математики, что изучает булевы алгебры (которые ты, гы-гы, назвал булевой логикой)

3. формальная логика — это, гы-гы, вовсе и не раздел математики; разделами математики со словом «логика» могли бы быть: интуиционистская логика, классическая логика и куча других

____________________________________________________________________

но ты не стесняйся, продолжай — а мы поржем :-)

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

А я говорю про очень скользкую штуку — про своё наблюдение, что некоторые концепции очень быстро обретают «аппаратную мозговую поддержку».

Ну так аппаратная поддержка не появляется из ниоткуда :)

При чём здесь другой инструмент?

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

Опять домыслы.

Это не домыслы. Если бы вы прочитали алгоритм то многие вопросы уже бы не задавали :)

Я полностью прочитал и большей частью понял вот это: http://docs.racket-lang.org/reference/syntax-model.html. И мельком просмотрел вот это: http://docs.racket-lang.org/reference/Macros.html.

Фактически про гигиену вам оттуда нужен вот этот абзац:

Before the expander passes a syntax object to a transformer, the syntax object is extended with a syntax mark (that applies to all sub-syntax objects). The result of the transformer is similarly extended with the same syntax mark. When a syntax object’s lexical information includes the same mark twice in a row, the marks effectively cancel. Otherwise, two identifiers are bound-identifier=? (that is, one can bind the other) only if they have the same binding and if they have the same marks—counting only marks that were added after the binding.
Все остальное вам не нужно (то есть потом оно вам понадобится - но оно все, скажем так, «высший пилотаж», точно так же как особенности рантайма в CL которые тоже чрезвычайно сложны, но как и тут для написания простых макросов не нужны).

Мне крайне сложно мысленно представлять работу этого механизма.

Ну я честно не вижу тут ничего сложного. Вот смотрите

(define-syntax name transformer) = (defmacro name (compose syntax-local-introduce transformer syntax-local-introduce).

Самое интересное, что зеркально:

(defmacro name transformer) = (define-syntax name (compose syntax-local-introduce transformer syntax-local-introduce).

Естественные концепции сами притягивают людей, поэтому многие пишут на ненавидимом вами (и недолюбливаемом мной) Common Lisp.

Но гигиеническая система более естественна чем негигиеничекая. Это известный _факт_. Более консистентная система с меньшим набором ad-hoc правил всегда более естественна. А система гигиеническая именно такая - более консистентная, с меньшим набором правил. Грубо говоря - чтобы успешно писать гигиенические макросы надо знать значительно меньше, чем при написании негигиенических.

В чём проблема вообще? :-)

В том, что если гигиены нет, вы не можете выбирать - использовать ее или не использовать :)

Я писал выше:

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

А весь разговор, напомню, был о том, нужно ли выкидывать на свалку defmacro и полностью переходить на гигиенические системы. Напомню свою позицию — нет, нахрена себе что-то запрещать, если оно помогает решать задачу? Хочу defmacro — использую defmacro. Хочу забить гвоздь молотком — забиваю. Problem?

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

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

В этом и ключевое отличие - они есть, то, что изучает математика - его нет.

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

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

Кретин, алгебра жегалкина - это тоже логика, с ограниченным базисом операций.

Ломающие известия - набор операций в алгебре Жегалкина полный, так что логика под ней все та же (булева).

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

В этом и ключевое отличие - они есть, то, что изучает математика - его нет.

Это неправда. Любая наука изучает исключительно абстрактные объекты. Например, та же химия может изучать химический элемент _в общем_ (не существующая в реальности абстракция), но не изучает конкретный инстанс этого элемента (вот эту конкретную молекулу). Так же и математика изучает не это конкретное зернышко или эту конкретную спичку, а число «1» в общем.

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

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

Вообще булева алгебра не зря имеет полное официально название «алгебра логики». Если булева алгебра = логика, то алгебра логики = логика, что было бы странным, не находишь?

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

Конечно «булевы алгебры» != «булева логика», как «модели» (м.ч.) != «теория» (е.ч.), но кое-что меня смутило.

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

http://www.paultaylor.eu/stable/prot.pdf (1.1.1).

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

У таких моделей, к тому же, есть доказательная полезность. На самом деле, если вспомнить современные определения полноты, правильности, непротиворечивости и т.п. ─ они завязаны на понятия языков, L- теорий, моделей и структур (часто алгебр универсальной алгебры). Например, теорема о неполноте (первая) получается как следствие из построения алгебры Тарского для PA (и любой теории включающей PA) ─ построив класс эквивалентности |_| относительно доказуемости в PA и взяв за TA булеву алгебру с порядком таким, что |x| ≤ |y| iff PA ⊢ x → y и |x| < |y| iff PA ⊢ x → y and PA ⊬ y → x, с |⊥| и |⊤| в качестве нижних и верхних элементов, можно связать свойства InCon и Con для PA со свойством Den для TA, определяемым как Den(TA) iff |x| < |y| ⇒ ∃ z |x| < |z| < |y|, следующим образом: 1) Если InCon(PA), то Den(TA); 2) Если Con(PA) и Den(TA), то существует z такой, что PA ⊭ z и PA ⊭ ¬z (так как |⊥| < |z| < |⊤|); 3) Для расширения PA' = PA ∪ {y, ¬x}, где |x| < |y|, верно Con(PA') и можно найти z такой, что PA' ⊭ z, PA' ⊭ ¬z и |x| < |(y ∧ z) ∨ x| < |y|, откуда Den(TA). Что эквивалентно теореме о неполноте.

С другой стороны, если брать не «sufficiently strong» языки, а более слабые (те же нулевые) чем PA, то подобного построения может не получиться ─ логики будут правильные и полные, но не противоречивые. В этом смысле булевы логики и алгебры находятся просто в прямом синтаксическо-семантическом соответствии.

другими примерами которой будет кольцо целых чисел или поле вычетов по модулю 3

Обратно ─ разным алгебрам можно сопоставить внутренний логический язык, то есть (ко)интерпретировать их как модели неких теорий. Моноидам, группам, кольцам, решёткам, графам, векторным пространствам и т.п.

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

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

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

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

У таких моделей, к тому же, есть доказательная полезность.

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

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

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

наука об матефизических объктах, которые не существуют в физическом мире,
не существуют в физическом мире

Таким образом математика не подпадает под определение:

объективных знаний о действительности.

dixi

В качестве примера подумай, как ты опишешь кучу зерна не имея чисел

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

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

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

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

Таким образом математика не подпадает под определение:

объективных знаний о действительности.

2 + 2 = 4. Объктивно? Да. Почему? Потому что выполняется для сложения любых пар объектов. Применимо к действительности? Да. Отражает свойства действительности? Да. И где ты тут не видишь изучения действительности?

А на мой пример с интегрированием (читать чуть выше по треду) пока что никто ничего не смог путного ответить.

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

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

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

Таким образом математика не подпадает под определение:

Прикинь, никакя наука не подпадает.

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

При чем тут «сиволы и системы счисления», бедняша?

Я стараюсь использовать интуитивно понятную

интуитивно

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

инстинкт

Тебе откаментить, или сам памперс поменяешь?

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

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

Хреновая из тебя ванга. Я уже давно все понял (пруф: Allegro CL 9.0 Free Express Edition стал доступен для загрузки (комментарий)), и моя цель — показать, что ты очередной корм для тролля. Это горькая правда, с которой тебе придется смириться.

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

Так дебил только херню и может нести)

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

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

Думаю, это преувеличение - mv вон код генерит и, как я понимаю, экономит время не на бумаге.

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

Любая наука изучает исключительно абстрактные объекты.

Нет, до абстрактных объектов наука абстрагируется, например «представим, что объект - материальная точка», «для простоты предположим, что сфера идеальная», «допустим, сила притяжения константа 9,8».

но не изучает конкретный инстанс этого элемента (вот эту конкретную молекулу).

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

Так же и математика изучает не это конкретное зернышко или эту конкретную спичку

Нет

а число «1» в общем.

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

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

Вообще булева алгебра не зря имеет полное официально название «алгебра логики». Если булева алгебра = логика

Нет, не так, булева алгебра = булевая логика, не просто «логика».

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

Кодогенерация экономит время на бумаге, а IRL имеет свои нехилые накладные расходы.

Думаю, это преувеличение

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

mv вон код генерит

Мало у кого есть ресурсы поступать так: Лондонская фондовая биржа переходит на Linux после убытков из-за Windows (комментарий)

и, как я понимаю, экономит время не на бумаге.

Это всего лишь значит, что в его случае выигрыш больше накладных расходов. И я не уверен, что даже в его конторе генерируется 100% кода.

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

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

anonymous
()
Ответ на: комментарий от quasimoto

Конечно «булевы алгебры» != «булева логика»

Логика, по своей сути,- базис применимых операций, т.е. просто _правила_ (при чем какую логику мы ни возьмем, что логику предикатов, что логику Аристотеля, что *внимание* арифметику). Арифметические операции - это правила (логика) манипуляции арифметическими операндами. Алгебра (любая) вне рафинированных бессмысленных значков существовать без логики (операций над значками) не может - следовательно разделение логики и алгебры бессмысленно в контексте обсуждения например «булевой алгебры».

alienclaster ★★★
()
Ответ на: комментарий от anonymous

Чувак, ну если ты не разбираешься в предмете, то не смешил бы народ своими домыслами, показывая свое невежество и даже некоторое скудоумие. Подучился бы что ли... книжки почитай, подумай.

Количество тупиц зашкаливает.

alienclaster ★★★
()
Ответ на: комментарий от tailgunner

Просто есть случаи, когда написание своего языка выгодно

Ну, то есть они есть. Я свел множество этих случаев к наличию «пацанов с опытом и мозгами».

mv вон код генерит

Мало у кого есть ресурсы поступать так

Умных мало, да

alienclaster ★★★
()
Ответ на: комментарий от Norgat

В этом и ключевое отличие - они есть, то, что изучает математика - его нет.

Т.е. по твоему если ты не можешь чего-то потрогать рукой, то этого нету?

Физические процессы *влияют* на объективный мир, абстракции - нет, и руки здесь ни при чем.

alienclaster ★★★
()
Ответ на: комментарий от alienclaster

Просто есть случаи, когда написание своего языка выгодно

Ну, то есть они есть. Я свел множество этих случаев к наличию «пацанов с опытом и мозгами».

А оно не сводимо.

Умных мало, да

Тех, кого ты считаешь умными, наверняка мало.

tailgunner ★★★★★
()
Ответ на: комментарий от Norgat

Что есть в химии кроме описания химических элементов

Эксперименты. В школе должны были показать, но ты, похоже прогуливал и теперь такую херню несёшь.

anonymous
()
Ответ на: комментарий от alienclaster

Он как раз пишет правильно в отличие от такого дебила как ты. Тебе же русским языком объяснили, что математика не сводится просто к какому-нибудь языку - язык математики представляет из себя лишь удобное средство выражения математической мысли. Можно говорить и о языке, на котором говорят физики. Частично он сводится к математике, т.е. к некоторым математическим моделям, которые некоторым образом соотносятся с реальными физическими объектами.

Ну, например, модель гармонического осциллятора,которая, кстати, может применяться и для описания механических колебаний, и колебаний в электрических цепях и т.д. Не пишу тут свой малограмотный бред, не засоряй топик своим невежеством.

anonymous
()
Ответ на: комментарий от Norgat

если ты не можешь чего-то потрогать рукой, то этого нету?

Если никакой объект нашей реальности не может с этим провзаимодействовать, то в нашей реальности этого нету.

anonymous
()
Ответ на: комментарий от Norgat

А тут бац и придумывают интегрирование и уже могут решать задачу измерения объёма бочки без переливания воды, круто да?

Ты что-то настолько тупой, что на высказывание «математика - язык, а не наука» возражаешь высказыванием «нет, математика полезна, а ее достижения приложимы. У тебя ложку-то держать интеллекта хватает, или руками жрешь?

anonymous
()
Ответ на: комментарий от anonymous

средство выражения математической мысли

Такой мысли не бывает, маразматик.

Можно говорить и о языке, на котором говорят физики. Частично он сводится к математике, т.е. к некоторым математическим моделям, которые некоторым образом соотносятся с реальными физическими объектами.

Дебил, для того, чтобы выразить физические процессы - их записывают и формализуют, т.е. придумывают конкретную математику для них, далее она может не стыковаться с другими, но это не означает, что «язык физики частично свобдится к математики», ты тупое гсм-ное невежество или просто баран.

которые некоторым образом соотносятся с реальными физическими объектами

Современная физика никаким раком с «реальными физическими объектами» не соотносится, он вся из себя «теоретическая», одни абстракции и больше ничего.

alienclaster ★★★
()
Ответ на: комментарий от anonymous

Любая наука изучает исключительно абстрактные объекты.

Чушь. Наука изучает исключительно результаты экспериментов.

химия может изучать химический элемент _в общем_

Путём проведения экспериментальных наблюдений над реальными химическими элементами. Без этого она вырождается в алхимию.

anonymous
()
Ответ на: комментарий от tailgunner

Умных мало, да

Тех, кого ты считаешь умными, наверняка мало.

Это в том числе, умных - мало *вообще*

Я свел множество этих случаев к наличию «пацанов с опытом и мозгами».

А оно не сводимо.

Вывод на основании опыта, твой - может отличаться.

alienclaster ★★★
()
Ответ на: комментарий от alienclaster

Тех, кого ты считаешь умными, наверняка мало.

Это в том числе, умных - мало *вообще*

А если еще наложить твои критерии, их еще меньше.

Вывод на основании опыта

Подумать попробуй.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Вывод на основании опыта

Подумать попробуй.

О чем?

А если еще наложить твои критерии, их еще меньше.

Вероятно, да.

alienclaster ★★★
()
Ответ на: комментарий от tailgunner

О накладных расходах.

Они велики, иногда огромны, зачастую не оправданы - я и не отрицал. Но от писанины на VHDL при чем таким образом, чтобы он был полностью синтезируем и эффективно синтезируем под конкретный компилятор в низкоуровневый HDL - это беспощадная рутина, которой «умные пацаны с опытом» стараются избегать.

alienclaster ★★★
()
Ответ на: комментарий от alienclaster

Акуеть.. какой дебил однако.. конечно, не соотносится.. совсем не соотносится.

Вчерашний выпусник школы или пту?

ты, безмозглый баран, чем сейчас пользуешься? компом да? Если бы она никак с реальными физическими объектами не соотносилась, то ты не сидел бы за клавой, дебил. Бля, скока дебилов нарожалось с завышенным ЧСВ...

anonymous
()
Ответ на: комментарий от alienclaster

Это вас, блядей, так стали в школах что ли учить? Чую из тебя очередной Петрик получится.. Жаль бедную Россию, где все больше подобных сраных дибелоидов.

anonymous
()
Ответ на: комментарий от Norgat

Чучмеки пользуются идеей целых положительных чисел, но не используют принятую нами нотацию, т.е. они используют элементарую математику.

Ну, вот. Начал путать язык и реальные объекты и почти сразу скатился до генерирования принципиально нефальсифицируемой брехни.

Животный просто жрут и запасают столько, сколько им говорит инстинкт, они ничего не считают.

Внезапно!

Применимо к действительности? Да. Отражает свойства действительности? Да

Между «отражать свойства Х» и «быть Х» есть маленькая-маленькая разница.

anonymous
()
Ответ на: комментарий от alienclaster

Математика изучает числа, а не спички. Спички мы приводим в пример, чтобы было понятней.

А как мы получаем числа? Ответь на этот вопрос и двинемся дальше.

Norgat ★★★★★
()
Последнее исправление: Norgat (всего исправлений: 1)
Ответ на: комментарий от alienclaster

следовательно разделение логики и алгебры бессмысленно в контексте обсуждения например «булевой алгебры».

Давай зафиксируем - ты отождествляешь понятия булевой алгебры как алгебраической структуры и булевой логики? Тогда задайся вопросом сколько элементов в множестве булевой логики и сколько - в множестве булевой алгебры.

Также вопрос - у модели всегда одна теория, а у теории - одна модель?

quasimoto ★★★★
()
Ответ на: комментарий от x4DA

ты ведь реально херню несешь

Может быть, но ты ведь меня поправишь?Итак:

Правда ли то, что сообщение вышеуказанного тролля (alienclaster который) — чистый вброс? Или я ошибся?

Правда ли то, что куча народа в этом треде вышеуказанного тролля сытно покормили? Или я ошибся?

linuxnewb
()
Ответ на: комментарий от alienclaster

Современная физика никаким раком с «реальными физическими объектами» не сотносится, он вся из себя «теоретическая», одни абстракции и больше ничего.

А вот тут ты перегибаешь. Из того, что физики пытаются выжать из экспериментов как можно больше информации никоим образом не следует будто они оперируют одними только абстракциями.

anonymous
()
Ответ на: комментарий от tailgunner

Это всего лишь значит, что в его случае выигрыш больше накладных расходов. И я не уверен, что даже в его конторе генерируется 100% кода.

Генерируются самые сложные ядра (логика работы с биржевыми данными). Обвес на VHDL'е пишут, ибо там всё достаточно просто и (!) привычно. У саморазработанного языка есть один существенный минус: документацию на него не разработали. Соответственно, входной барьер хоть и не слишком большой, но есть. В примитивном случае можно новый язык использовать, как аналог VHDL, и даже в этом случае есть конкретный профит (самописный оптимизатор всё так же работает), но чтобы писать на лиспе, надо писать на лиспе. В том смысле, что про мощные фичи в языке надо знать и уметь ими пользоваться.

Радует, что народ начал входить во вкус. Инструмент-то достаточно удобный: и пайплайн никогда не затыкается, и симулятор логического уровня есть, и graphviz'ом потактово всё разрисовывает... На голом VHDL'е даже опытные девелоперы дофига ошибок делают, и некоторые биржи больше года не могли написать.

mv ★★★★★
()
Ответ на: комментарий от mv

Генерируются самые сложные ядра (логика работы с биржевыми данными)

И, видимо, таких ядер много. Понятно, что при поточной разработке свой инструмент окупится.

graphviz'ом потактово всё разрисовывает

А потом этой картинкой можно обматываться, как мумии? %)

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от quasimoto

Давай зафиксируем - ты отождествляешь понятия булевой алгебры как алгебраической структуры и булевой логики?

Нет, я утверждаю, что саму аксиоматику булевой алгебры задает булева логика, и что алгебра и логика - неразрывны. Булева алгбра - базис логики высказываний, которая по сути - тупо классическая (бинарная) логика. Многи исчисление высказываний не гнушаются назвать логикой высказываний.

сколько элементов в множестве булевой логики и сколько - в множестве булевой алгебры.

И сколько же?

Также вопрос - у модели всегда одна теория, а у теории - одна модель?

У конкретной матмодели скорее всего одна теория (хотя одна и та же матмодел может фиксировать больше одной теории), но теорию наверняка можно прсдтавить >=1 математической моделью.

alienclaster ★★★
()
Ответ на: комментарий от Norgat

А как мы получаем числа?

Абстрагируемся от спичек.

Ответь на этот вопрос и двинемся дальше.

А смысл? Все что хотел, я уже озвучил.

alienclaster ★★★
()
Ответ на: комментарий от tailgunner

И, видимо, таких ядер много. Понятно, что при поточной разработке свой инструмент окупится.

Поэтому и написался...

А потом этой картинкой можно обматываться, как мумии? %)

В точку. Полотно огроменное получается, там же всё в параллель работает :)

mv ★★★★★
()
Ответ на: комментарий от mv

саморазработанного языка есть один существенный минус: документацию на него не разработали

vhdl без документации, наверняка, обладает примерно равным порогом вхождения.

В примитивном случае можно новый язык использовать, как аналог VHDL

А вы как используете, расширяете семантику? Можно пример? Краткий.

На голом VHDL'е даже опытные девелоперы дофига ошибок делают, и некоторые биржи больше года не могли написать.

Кстати, с началом вашей разработки конкуренция в сегменте поусилилась?

alienclaster ★★★
()
Ответ на: комментарий от alienclaster

А вы как используете, расширяете семантику? Можно пример? Краткий.

Как в обычном общелиспе, в общем-то.

(define-foo-macro insert-clks (&rest clks)
  `(:block
       ,@(loop for (clk-name condition . nil) in clks
               for clk-cond-name = (ut:build-symbol clk-name "-cond")
               collect `(declaration :top (unsigned bit) ,clk-name)
               collect `(declaration :top (unsigned bit) ,clk-cond-name)
               collect `(setf ,clk-cond-name ,condition))
     (%insert-clks ,@clks)))

Кстати, с началом вашей разработки конкуренция в сегменте поусилилась?

В области ЯВУ-библиотек для генерации VHDL - определённо.

mv ★★★★★
()
Ответ на: комментарий от alienclaster

Абстрагируемся от спичек.

Ну ты сам всё сказал, больше я тебе разжёвывать ничего не буду, надоело.

Norgat ★★★★★
()
Ответ на: комментарий от Norgat

Ну ты сам всё сказал, больше я тебе разжёвывать ничего не буду, надоело.

Поубавь свое невежеское хамство - вместе с прочими быдлокодеришками тупишь уже третью страницу и вдруг оказывается, что нечто «разжовываешь», стыдно должно быть бл#%ть.

alienclaster ★★★
()
Ответ на: комментарий от alienclaster

чего, чего ты говоришь? Теоретическая механика оторвана от реальности? Нука поподробнее...

anonymous
()
Ответ на: комментарий от anonymous

чего, чего ты говоришь? Теоретическая механика оторвана от реальности? Нука поподробнее...

Я не о теормехе, а современной теоретической физике, квантовая физика например.

alienclaster ★★★
()
Ответ на: комментарий от alienclaster

О чем, о чем? о квантовой физике ты чего-то еще ляпнул, солнце ты наше лучезарнеое? Нука, давай поподробнее об оторванности квантовой физики от реальности... Мы тут все дружно посмеемся (не зря я про Петрика вспомнил)

anonymous
()
Ответ на: комментарий от tailgunner

А обратное преобразование, VHDL -> CL, инструмент умеет?

Ага. Не в CL, а в наш лиспохдл.

mv ★★★★★
()
Ответ на: комментарий от alienclaster

Петрики что ли? Всякие академики из РАЕН? Мне-то как раз интересно, что ты мне как дилетант (который заикнулся о предмете, о котором и понятия не имеешь) можешь расказать мне, профессиональному физику?

anonymous
()
Ответ на: комментарий от alienclaster

Кстати, интересная штука.... Встречаются узкие специалисты (например, в физике), причем весьма профессиональные, но только вылезут за рамки своей специализации, как начнут нести всякую дилетанскую чушь. Видимо, иногда сказывается отсутсвие системного мышления. Не удивлюсь, если может тебе подобные профессионалы попадались.

anonymous
()
Ответ на: комментарий от quasimoto

В этом смысле булевы логики и алгебры находятся просто в прямом синтаксическо-семантическом соответствии.

если бы тот чувак сказал что-то хоть как-то осмысленное, я бы не цеплялся к словам, даже если бы такого соответствия не было

по крайней мере его первое высказывание позволяло его как-то понять и ответить, а вот последующие — нет

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от linuxnewb

...и, кстати, продолжают кормить. Так в чем же херня?

он (alienclaster то есть) представляет собой генератор окрашенного шума, в чем его некоторая польза

и еще да, над ним приятно поржать

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от alienclaster

средство выражения математической мысли

Такой мысли не бывает, маразматик.

вот не надо говорить за всех

у тебя математической мысли не бывает, это уже все поняли

но ты не стесняйся, продолжай нам рассказывать про *логику* жегалкина

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от anonymous

мне, профессиональному физику?

Копию трудовой покажи? :)

mv ★★★★★
()
Ответ на: комментарий от alienclaster

Нет, я утверждаю, что саму аксиоматику булевой алгебры задает булева логика

Примерно так, да. Булевы алгебры это просто какие-то конкретные примеры структур (алгебраические, топологические, теоретико-множественные и т.п.) которые удовлетворяют набору булевых законов, то есть являются моделями такой теории (аксиоматизации).

и что алгебра и логика - неразрывны.

Это интересно, потому что определённо верно в каком-то смысле, но не годится именно в такой форме как сколько-нибудь полезное утверждение / методология / etc.

Ну хотя бы - что за «алгебра» и «логика»? И как они связаны?

И сколько же?

Сама булева алгебра, то есть дополненная дистрибутивная решётка может иметь сколько угодно элементов. Если взять LTA, то она будет БА вовсе бесконечной в PA, но конечной и гомоморфной БА-двойке в CPL. Вообще, та БА которая неразрывно связанна с логикой высказываний это именно БА-двойка, она же - первая нетривиальная БА, она же - начальный объект категории ограниченных решёток, и она же - алгебра подъобъектов в любом классическом топосе (= с классической логикой в качестве языка топоса, из классичности топоса и его логики как раз следует булевость алгебры подъобъектов).

У конкретной матмодели скорее всего одна теория (хотя одна и та же матмодел может фиксировать больше одной теории), но теорию наверняка можно прсдтавить >=1 математической моделью.

Матмодель = модель?

Язык это некая символическая и формальная система, она чисто синтаксическая и финитная, любые вычислительные операции (вроде редукций) мы бы проводили над ней. Мы задаём её сигнатуру как тройку из множеств констант, символов функций и символов отношений, например 2 = ⟨{⊥, ⊤}, {¬, ∧, ∨}, ⊘⟩. Если символов отношений нет, то это будет алгебра. Дальше на основе этой тройки можно индуктивно перечислить термы и формулы (нулевой порядок):

t, s, ... ::= c | α | f(t, ...)
φ, ψ, ... ::= t = s | r(t, ...)

любое подмножество множества всех перечислимых таким образом формул это теория (набор аксиом), то есть в таком-то языке такого-то порядка существует множество теорий (принятых как наборы аксиом). Например, все законы булевой логики можно выписать как определённый набор формул, сделав таким образом теорию булевых алгебр в языке нулевого порядка. Любое конкретное представление сохраняющее основные свойства теории будет моделью для такой теории, та же булева решётка ⟨{⊥, ⊤}, {¬, ∧, ∨}, {≤}⟩, например. Хотя вообще таких моделей много (также как много конкретных групп в теории групп), обратно - для данной модели есть одна полная теория, но все её подтеории также теории данной модели.

quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

Это интересно, потому что определённо верно в каком-то смысле, но не годится именно в такой форме как сколько-нибудь полезное утверждение / методология / etc.

Тут дискуссия вообще далека от какой бы то ни было пользы. Видимо, надо сворачиваться.

Ну хотя бы - что за «алгебра» и «логика»? И как они связаны?

Честно говоря, я уже что-то подобное объяснял здесь, и терминологический «срач» уже как-то приелся порядком. Поэтому сори, но я покидаю тему.

alienclaster ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.