Автор | Сообщение |
misha![]()
1275 сообщений |
#4525 2011-07-03 20:25 GMT+3 часа(ов) |
Цитата Не работает? А по мне так наоборот, просто нужно уметь с ним работать. Цитата Прошу прощения! Но мне показалось, что вы меня начали учить уму разуму. Цитата А вот это уже сарказм. Я себе подобное позволял? Цитата Просто это так называется. |
|
Kergan
300 сообщений |
#4526 2011-07-03 20:37 GMT+3 часа(ов) |
Цитата выдавать невнятную ошибку в случае, когда должен быть коректны результат - да, это не работает. Цитата Вы не понимаете очевидного. В каждом ЯП есть свои принципы написания кода. В Racket макросы гигиенические и они _должны_ быть гигиеническими и безопасными. Если гигиена и нарушается - это должно быть сделано контролируемо, так, чтобы не приводило к некорректному поведению. И PLT team затратили множество усилиий на то, чтобы так и было. Вы же пишете макросы, под которые язык просто не расчитан. Вот смотрите, в том же CL есть система пекеджей, которая предотвратит 90% проблем, связанных с негигиеничностью макроса. В Racket такого нет, потому что подразумевается, что макрос гигиеничен. Понимаете? И в данном случае "уметь работать с макросом" = не писать макросы, которые раскрываются в ваш infix (и даже в этом случае я не уверен, что вы не словите в каком-то случае какую-нибудь херь), потому что если писать - то нету реального способа проконтролировать некорректное использование. пользователь модуля, который пользуется модулем, в котором использован модуль, в котором применяется ваш onfix: не обязан уметь применять ваш infix:. Он даже не должен вообще знать о том, что какой-то infix: там в недрах применяется. Цитата Вообще-то я серьезно. Ну в самом деле - я вам привел многократные примеры, когда в простейшей ситуации вместо корректного поведения ваш макрос дает неотлавливаемый изнутри эррор или undefined behavior, вы мне ответили, мол "да я и не собирался его использовать". Я вас неверно понял или что? Цитата Повторяю - я просто указал на пару очевидных недостатков одного конкретного макроса в контексте одного конкретного языка. На Racket такие макросы писать нельзя, за такое надо отрывать руки. Точка. Если бы это был CL - я бы и слова не сказал. Цитата Что именно? |
|
Kergan
300 сообщений |
#4527 2011-07-03 20:42 GMT+3 часа(ов) |
Ой, я, кажется, понял, что подразумевалось под "уметь использовать"
![]() |
|
misha![]()
1275 сообщений |
#4528 2011-07-04 03:26 GMT+3 часа(ов) |
Цитата Достаточно придерживаться простых правил: 1) "Принцип однородности". Нельзя использовать "не гигиенические" макросы в теле гигиенических. 2) Все используемые "не гигиенические" макросы должны быть экспортированы. 3) Отказаться от модулей и перейти на пакеты ![]() Цитата Мне нужен был транслятор, но так как я посчитал, что транслировать константное выражение каждый раз, когда оно необходимо - просто тупо, поэтому и оформил его в виде макроса. Мне не нужен был макрос для постоянного использования. Я даже не предполагал, что он вызовет такую бурную дискуссию. Цитата Процесс который вы описывали относится к стадии создания промежуточного кода. Цитата Почти угадали ![]() (define-values (stdout stdin pid stderr dotForth) |
|
Kergan
300 сообщений |
#4529 2011-07-04 12:15 GMT+3 часа(ов) |
Цитата Другими словами - вы предлагаете полностью отказаться от встроенных механизмов гигиены, пытаясь вместо этого реализовывать ее руками при помощи костылей ![]() Но зачем? Ради чего? Не проще ли сделать макрос гигиеническим и не парить мозг? То есть логично, что если мы отказываемся от многочисленных удобств и преимуществ - это не должно быть просто так ![]() Цитата Это невозможно. Пакеты не поддерживают фазы, а без них нельзя ни гарантировать консистентность макроэкспанда, ни использовать рантайм библиотеки при определении макросов. Печаль, короче ![]() ЦитатаНу я же не знал, зачем вам этот макрос нужен. Просто увидел отвратно написанный макрос и сказал, что таких макросов писать нельзя. По крайней мере на Racket. Цитата Я не могу понять - какой процесс и что вы называете "промежуточным кодом". Цитата Руками лепить генсимы в ЯП с автоматической гигиеной - это нечто, ага ![]() |
|
misha![]()
1275 сообщений |
#4530 2011-07-04 13:06 GMT+3 часа(ов) |
Цитата Я надеюсь вы догадались, что эти правила были простой шуткой. Цитата Я считаю, что смешивание двух разных стилей плохая идея. Цитата В данном случае промежуточным кодом является финальный синтаксический объект после всех экспандов. А у CL - это АСД(список) + environment. Цитата И при этом использовать (define-syntax (defmacro so) |
|
Kergan
300 сообщений |
#4531 2011-07-04 14:16 GMT+3 часа(ов) |
Цитата Так я вам именно об этом и говорю ![]() В Racket макросы по дефолту гигиенические, если вы делаете их негигиеническими - это смешение стилей. Цитата Ах, ок, я просто всегда называл это full-expanded code. Цитата Но зачем? Ведь на паттернах макросы писать гораздо проще и быстрее, чем обрабатывая списки руками. |
|
misha![]()
1275 сообщений |
#4535 2011-07-05 13:47 GMT+3 часа(ов) |
Цитата Так оно и есть. Но ведь и смешивание без "предупреждения" инфиксного и постфиксного кода также является плохой идеей. Цитата Ну, так fully-expanded code имеет более общее название - intermediate code. Цитата Все зависит от ситуации. Ведь мощные паттерны существуют только у Racket, а у большинства r6rs реализаций их нет. Но с другой стороны, они имеют средства для обработки синтаксических объектов вручную. |
|
misha![]()
1275 сообщений |
#4536 2011-07-05 13:55 GMT+3 часа(ов) |
Я немного исправил свой макрос, сделав его гигиеническим. (исходник)
>(infix: 6 + (4 * 5 + 8) * 7 + 23) Пишите, если обнаружите ошибки. |
|
Kergan
300 сообщений |
#4538 2011-07-05 18:09 GMT+3 часа(ов) |
Цитата Нет, не является. Практически во всех языках есть такое смешивание - и ничего ![]() Цитата Не вижу логики в том, чтобы называть промежуточным кодом код, который ничем не отличается от исходного. Цитата В лиспе есть анонимные функции, а в си их нет. С другой стороны, си имеет средства для того, чтобы их эмулировать их вручную ![]() Цитата С гигиеной все, кажется, в порядке, а вот по части алгоритма - у вас там функции с set! вызываются изнутри тела match. А если внутри match произойдет бектрекинг? Вы гарантируете, что его не будет? К слову, ваша реализация работает в полтора раза медленнее моей ![]() |
|
misha![]()
1275 сообщений |
#4540 2011-07-06 14:45 GMT+3 часа(ов) |
Цитата Вы о каких языках? У большинства ведь есть ограничения в виде синтаксиса и сложной семантики. Цитата У меня он не реализован. В случае обнаружения синтаксической ошибки посылается исключение. Цитата Это из-за поддержки конструкции [ test ? then : else ], но я уже оптимизировал данный процесс. |
|
Kergan
300 сообщений |
#4543 2011-07-07 03:04 GMT+3 часа(ов) |
Цитата Да практически обо всех. Там спокойно соседствуют инфиксные операторы и префиксные функциональные вызовы. И ничего. Это какбе привычное, устоявшееся смешение стилей ![]() Цитата Он не у вас реализован, он есть в match по дефолту. Цитата Ну это в том случае, если никакой паттерн не сматчится. а если начнет матчиться паттерн 1, на середине обломится, потом начнет матчится паттерн 2 и будет успшено сматчен? Корчое в данном случае сайдэффекты лепить не стоит, потому что внутри match вы никак не контролируете control-flow. Цитата Вы уверены? Паттерн выглядит простеньким. |
|
misha![]()
1275 сообщений |
#4544 2011-07-09 15:22 GMT+3 часа(ов) |
Цитата У них есть синтаксис и сложная семантика, а у рэкета их нет, да и ваш язык их не предусматриваете. Поэтому он неправильно отреагирует на выражение типа (map - '(1 2 3)) Цитата О какой версии исходника идет речь? Приведите пример "опасного" выражения. Цитата А вы учли накладные расходы? |
|
misha![]()
1275 сообщений |
#4545 2011-07-09 15:35 GMT+3 часа(ов) |
Цитата А как по вашему должен выглядеть промежуточный код? Иначе, кто в своем уме будет использовать байт-код, если есть списки? Синтаксические деревья (как и трехадресный код, постфиксная запись) могут использоваться в качестве промежуточного кода. отредактировал(а) misha: 2011-07-09 15:44 GMT+3 часа(ов) |
|
Kergan
300 сообщений |
#4546 2011-07-11 15:21 GMT+3 часа(ов) |
Цитата Ну это уже проблема динамической типизации, тут ничего ни в каком языке не сделаешь. Я в данном случае пишу так: (map (-) `(1 2 3)). Цитата Ну, например, в Racket идет компиляция в байткод ![]() |
|
misha![]()
1275 сообщений |
#4547 2011-07-11 23:11 GMT+3 часа(ов) |
Цитата Поэтому я и рекомендовал перегрузить скобки. Либо использовать макрос. Кстати, для CL такой проблемы нет (mapcar #'- '(1 2 3)) Цитата Так это целевой код ![]() |
|
Kergan
300 сообщений |
#4548 2011-07-12 15:03 GMT+3 часа(ов) |
Цитата Зачем? Ну и я уже говорил - в данном случае скобки перегружать нельзя, потмоу что работать не будет. Цитата Ну так у меня тоже такой проблемы нет, как я уже сказал: (map (-) `(1 2 3)) ![]() |
|
Kergan
300 сообщений |
#4549 2011-07-12 15:04 GMT+3 часа(ов) |
Цитата целевой код - машинный, в который jit компилирует ![]() |
|
misha![]()
1275 сообщений |
#4550 2011-07-12 15:37 GMT+3 часа(ов) |
ЦитатаЯ вижу подмену понятий, вызванную .net и java ![]() Большинство интерпретаторов паскаля компилируют в P-код, который является исполняемым (jit может вообще отсутствовать). Там оптимизированный P-код является целевым кодом. Стадии компиляции: создание промежуточного кода --> оптимизация промежуточного кода --> генерация целевого кода. |
|
misha![]()
1275 сообщений |
#4551 2011-07-12 15:41 GMT+3 часа(ов) |
Цитата > (*) |
|
Kergan
300 сообщений |
#4552 2011-07-12 18:51 GMT+3 часа(ов) |
Цитата Это все верно для байткода Racket. Собственно, байткод Racket - специальный диалект лиспа сам по себе. Цитата нет, у меня (x) транслируется в x, если x - инфиксный оператор. |
|
megamanx
307 сообщений |
#4553 2011-07-12 22:19 GMT+3 часа(ов) |
Если нефиг делать - напишите реализацию, позволяющую производить неявное программирование, в т.ч. задавать функции без упоминания аргумента.
|
|
I wish I'd made you angry earlier
|
|
Kergan
300 сообщений |
#4554 2011-07-13 01:34 GMT+3 часа(ов) |
Цитата вот как-то так:
и потом писать: (map (* <> 2) `(1 2 3)) ; -> `(2 4 6) правда будет захват только внутреннего выражения. По-хорошему надо переопределять фигурные скобки, например. |
|
megamanx
307 сообщений |
#4555 2011-07-13 23:48 GMT+3 часа(ов) |
А вот реально реализовать такой синтаксис:
{[...][...][...]{[...][...]}}, где внутри {} каждая квадратная скобка выполняется своим потоком. Соответственно, вся {} выполняется, когда выполнятся все задания. Меня просто интересует - есть какой-нибудь язык, или какая-нибудь примочка в каком-нибудь языке, которая бы самостоятельно, не изменяя (значительно) синтаксиса языка, брала на себя задачу по распараллеливанию. Примеры всяких RAD-систем, где окошки автоматом в свои потоки запихиваются, я не рассматриваю. Вроде как язык допускает написание чистых функций, параллелить можно. Или может, кто-то делал подобное. |
|
I wish I'd made you angry earlier
|
|
Kergan
300 сообщений |
#4556 2011-07-15 01:49 GMT+3 часа(ов) |
Цитата Ну а в чем проблема? Пусть {[] ...} ридером трансформируется в (parallel [] ...) где parallel - макрос, который запускает параллельно все свои аргументы, устанавливает семфор и ждет, пока он освободится. |
|
misha![]()
1275 сообщений |
#4557 2011-07-16 01:02 GMT+3 часа(ов) |
ЦитатаКак байткод может быть диалектом лиспа? Его можно назвать промежуточным языком VM Racket (и то с натяжкой, т.к. он не имеет описания). Цитата А это уже на K(J) похоже, там крючки и вилки описываются с помощью скобок. |
|
misha![]()
1275 сообщений |
#4558 2011-07-16 01:13 GMT+3 часа(ов) |
Цитата Имхо, в нете достаточно диалектов лиспа основанных на комбинаторной логике. |
|
Kergan
300 сообщений |
#4559 2011-07-16 11:48 GMT+3 часа(ов) |
Цитата он имеет списочную структуру (то есть выражения в виде head/rest). Собственно, можно сделать на любой модуль decompile и посмотреть - вот то что получится, это и есть байткод, с точностью до обозначений ![]() Цитата ну и в хаскеле так же у меня только сделан сахарок, чтобы можно было не писать скобки вокруг оператора, если он в head позиции. То есть можно (+ 1 2 3), а не ((+) 1 2 3). |
|
misha![]()
1275 сообщений |
#4560 2011-07-16 13:09 GMT+3 часа(ов) |
Цитата Он имеет более сложную структуру, чем fasl, да и про оптимизацию не забудьте. А decompile работает наподобие .NET Reflector-а, поэтому не стоит говорить о сходстве с лиспом основываясь лишь на результате декомпиляции. |
|
Kergan
300 сообщений |
#4561 2011-07-17 07:14 GMT+3 часа(ов) |
Цитата Не знаю, какая структура у fasl, а у байткода-таки списочная. Фактически, байткод - это и есть full-expanded, только проводятся банальные оптимизации (типа dead-code elimination или разворачивания рекурсии), имена глобальных символов заменяются абракадаброй, имена локальных - позицией в стеке. Все примитивы (типа begin, lambda, define, let etc.) в байткоде сохраняются. Цитата а она на структуру байткода и не влияет |
|