Автор | Сообщение |
misha![]()
1275 сообщений |
#6448 2012-08-10 20:27 GMT+3 часа(ов) |
ЦитатаКак раз трансформеры (rename, set!) являются такими же низкоуровневыми средствами, как и datum->syntax. ЦитатаКто бы спорил ![]() ЦитатаДля правильной работы rename-transformer необходимо, чтобы id-stx принадлежал к определенному контексту, а иначе может появится несвязанный идентификатор. |
|
misha![]()
1275 сообщений |
#6449 2012-08-10 20:34 GMT+3 часа(ов) |
ЦитатаПредложенный синтаксис не читабелен ![]() ЦитатаА зачем перегружать синтаксис? Пусть будет (with-cycle id e (switch e1 e2 ...) ...) |
|
Kergan
300 сообщений |
#6450 2012-08-10 20:57 GMT+3 часа(ов) |
Цитата нет не являются Цитата и общая консистентность трансформеров гарантируется спецификацией. то есть если чтото не так - это баг. а если мы используем низкоуровневые средствами - то есть вероятность наткнуться на тот же баг, который уже был исправлен в трансформерах ![]() Цитата неясна проблема. в каком контексте идентификатор использовали (то есть какой у идентификатора локальный скоп в области использования) - тот и будет. никаких проблем, следить за контекстами е надо - контекст всегда один. Цитата зачем же ты его предлагал? ![]() Цитатада, можно и так. вообще можно и сам begin хитро перегрузить (чтобы никто не заметил), но мало ли - вдруг аукнется ![]() Например какой-нибудь макрос который будет расчитывать на этот begin его в новом begin'e не увидит - биндинг другой. |
|
misha![]()
1275 сообщений |
#6452 2012-08-10 22:19 GMT+3 часа(ов) |
ЦитатаЯвляются, т.к. они часть ядра. ЦитатаНе факт, ибо datum->syntax довольно часто используется в библиотеках, поэтому практически любой баг будет обнаружен очень быстро. Да и баги в простых функция встречаются довольно редко. Хотя у меня уже был негативный опыт с функцией sleep и parameterize. Но они были уже выявлены другими пользователями, поэтому мне не пришлось писать багрепорт. ЦитатаНу, например, когда контекст id вообще не из той оперы (make-rename-transformer (datum->syntax #f 'x)) ЦитатаОговорился, ранее предложенный ![]() (with-cycle id e1 e2 ...) (with-cycle f |
|
Kergan
300 сообщений |
#6455 2012-08-12 15:02 GMT+3 часа(ов) |
Цитата Ну и что? Важно, что они дают гарантии корректности. Цитата Ну я и говорю, в библиотеках это баг же изсправлен, а мы его повторим во время придумывания собственного велосипеда. Цитата Да нет, речь о том что мы сами баг посадим. Цитата то есть при использовании datum->syntax ![]() Я и говорю - как только вы начинаете использовать низкоуровневые средситва - прощайтесь с четкостью и прозрачностью макрлэкспанда. Цитата можно и так, только begin поменять на что-то другое. Лучше switch вместо него оставить. |
|
misha![]()
1275 сообщений |
#6456 2012-08-12 21:14 GMT+3 часа(ов) |
ЦитатаТак и datum->syntax дает гарантию корректности. ЦитатаНу, не факт. Хотя я не отрицаю, все может быть ![]() ЦитатаДело не в низкоуровневых средствах(макротрансформеры ведь тоже низкоуровневые), просто для корректности необходимо подставлять идентификатор(синтаксический объект) с правильным контекстом. ЦитатаА мне оба нравятся ![]() |
|
Kergan
300 сообщений |
#6457 2012-08-12 21:43 GMT+3 часа(ов) |
Цитата тут дело не в эстетических предпочтениях а в том, что биндинг begin уже занят. Цитата нет, не дает, т.к. это низкоуровневое средство. Цитата нет, не никзуровневые. они выражаются через datum->syntax. Цитата это точно как скзаать "для корреткности достаточно не делать ошибок". проблема в том, что подставить идентификатор с нужным контектом практически невозможно - во многих ситуациях можно всегда сделать так, что контекст будет плохим. чтобы этих ситуация избежаьт придется заново изобрести все те самые высокоуровневые средства и выражать макрос через них. |
|
misha![]()
1275 сообщений |
#6461 2012-08-14 23:32 GMT+3 часа(ов) |
ЦитатаКак раз begin используется по назначению (with-cycle id e1 e2 ...) ЦитатаКак и трансформеры ![]() ЦитатаКто выражается? Трансформер - это объект, участвующий в экспанде. Из него "извлекается" функция для преобразования синтаксического объекта. А так как эта функция может быть составлена пользователем, то в ней может содержаться все что угодно, хоть datum->syntax. ЦитатаКакие именно? |
|
Kergan
300 сообщений |
#6462 2012-08-14 23:54 GMT+3 часа(ов) |
Цитата А да, не посмотрел на паттерн. Цитата Нет. Цитата ну да, может. но пока вы туда datum->syntax не насовали, вам макросистема гарантирует, что "все будет хорошо". Как только насуете - никаких гарантий нет. Я бы даже сказал, есть гарантии, что в некоторых случаях ничего хорошего уже не будет. Цитата Да те самые syntax-case/rules. |
|
misha![]()
1275 сообщений |
#6463 2012-08-15 13:03 GMT+3 часа(ов) |
Что делает трансформеры высокоуровневыми?
ЦитатаЗабыли ваш опус про чужие макросы. Например, макросы рэкета частенько используют datum->syntax, но это не делает их грязными. ЦитатаА зачем их придумывать? Это же базовые вещи. |
|
Kergan
300 сообщений |
#6464 2012-08-15 13:37 GMT+3 часа(ов) |
Цитата Гарантии того, что все будет работать корреткно, очевидно же. Это достигается за счет инкапсуляции более низкоуровневых конструкций. Цитата Макросы racket вообще все используют datum->syntax, потому что #' выражается через datum->syntax. Но это низкоуровневые детали реализации - нам спецификация гарантирует, что эти datum->syntax использованы корректно. Если же окажется, что это не так - то перед нами баг стандартной библиотеки. Теперь вопрос на засыпку - где чаще встречаются баги, в стандартной библиотеке или в самописных велосипедах? Цитата Не зная. Вы же это предлагаете (писать ручные datum->syntax, что сводится к переизобретению syntax-case/rules) |
|
misha![]()
1275 сообщений |
#6465 2012-08-15 14:44 GMT+3 часа(ов) |
ЦитатаСнова вы про какие-то гарантии. Вы же сами уже писали, что от ошибок никто не застрахован. Все зависит от разработчика этого трансформера, и используемых библиотек. Почему трансформеры низкоуровневые? Трансформер - это базовая структура, которая обрабатывается во время экспанда. Трансформеры являются такими же базовыми структурами макросистемы, как и синтаксический объект. Цитата#' - это короткая форма для syntax. datum->syntax используют самописные ридеры, а базовые обычно используют еще более низкоуровневую функцию. ЦитатаВы так или иначе пишите велосипед - функцию-обработчик макротрансформера. ЦитатаНет, не предлагаю. Пусть каждый использует то, что он считает нужным. отредактировал(а) misha: 2012-08-15 14:58 GMT+3 часа(ов) |
|
Kergan
300 сообщений |
#6466 2012-08-15 17:54 GMT+3 часа(ов) |
Цитата а может вообще процессор перегреться. Цитата мы видимо о разных вещах говорим. вы что под трансформерами понимаете? Цитата угу, а syntax может иметь внутре шаблонные переменные, подстановка которых выражается через datum->syntax ![]() Вообще когда мы конструируем некоторый синтаксический объект из других, то никакого способа сделать это, кроме использования datum->syntax, не существует. Цитата вы занимаетесь казуистикой. еще раз - когда вы используете высокоуровневые средства типа шаблонов, синтаксических параметров, rename-transformer;ов и т.п., то разработчиками стандартной библиотеки вам гарантируется корректность. Ошибка в этом случае будет ошибкой ф-й стандартной библиотеки и только ее. Если вы только в своем трансформере решили явно использовать datum->syntax - никаких гарантий стандартная либа вам уже не дает, чтобы эти гарантии получить вам надо эту стандартную либо переизобрести. Цитата ну конечно каждый может использовать все, что хочет, однако решение более надежное и предсказуемое в работе всегда лучше, чем решение менее надежное и предсказуемое. то етсь отсутствие datum->syntax всегда лучше его присутствия и этого присутствия надо избегать, пока возможно. |
|
misha![]()
1275 сообщений |
#6468 2012-08-15 19:38 GMT+3 часа(ов) |
ЦитатаВидимо. О трансформерах я уже писал выше. ЦитатаСтранный юмор. ЦитатаПользователю обычно запрещают использовать еще более низкоуровневые средства. ЦитатаВот именно. ЦитатаМне понятен ваш страх перед datum->syntax. Но его ведь обычно и используют для написания анафорических макросов на r6rs. |
|
Kergan
300 сообщений |
#6469 2012-08-15 21:01 GMT+3 часа(ов) |
Цитата нет не писал Цитата это не юмр а продолжение вашей логики Цитата это вы про что? Цитата так об этом изначально и речь. не стоит использовать datum->syntax, если это не обосновано. Цитата да, обычно используют. но факт в том, что в r6rs просто нету синтаксических параметров, так что и выбора нет. а если синтаксические параметры есть - то лучше использовать их, согласитесб? |
|
misha![]()
1275 сообщений |
#6470 2012-08-15 21:26 GMT+3 часа(ов) |
Цитата"Трансформер - это базовая структура, которая обрабатывается во время экспанда." "Из него "извлекается" функция для преобразования синтаксического объекта." ЦитатаГде вы увидели логику? Может хватит уже придумывать. ЦитатаСм. исходники любой реализации r6rs. ЦитатаЕсли это не вызовет проблем, то почему бы и нет. |
|
Kergan
300 сообщений |
#6471 2012-08-15 22:13 GMT+3 часа(ов) |
Цитата ну вэтом определении трансформеры могут ыть низкуровневыми и высокоуровневыми. Цитата то етсь в ваших словах не было логики? ![]() Цитата клнкртенее Цитата так в том и дело, что проблемы вызывает datum->syntax, а не параметры ![]() |
|
misha![]()
1275 сообщений |
#6472 2012-08-15 23:31 GMT+3 часа(ов) |
Цитата"Трансформеры являются такими же базовыми структурами макросистемы, как и синтаксический объект." ЦитатаЯ не знаю, что вы там себе напридумывали, поэтому и спросил о какой логике идет речь. Во избежание проблем макрос syntax обычно реализуют с использованием более низкоуровневых средств, чем datum->syntax. ЦитатаПомимо datum->syntax могут существовать другие еще более низкоуровневые функции для создания синтаксического объекта. ЦитатаПараметры нужно использовать для создания "глобальных" макросов общего назначения, а не для создания простеньких анафорических макросов. |
|
Kergan
300 сообщений |
#6473 2012-08-16 07:47 GMT+3 часа(ов) |
Цитата и? Цитата Более низкоуровневых средств нет - в том смысле, что все, что мы можем сделать, мы можем сделать через datum->syntax. Как оно реализуется в том или ином случае на практике - уже не важно. Цитата например? Цитата Параметры нужно использовать во всех случаях, когда надо ввести анафору. То есть и в случае простеньких анафорических макросов в том числе - если вы их будете писать через datum->syntax, то куча ошибок гарантирована. Попробуйте хотя бы банальный aif написать так, чтобы он просто _работал_. Переизобретете параметры в итоге. Под "работал" я понимаю хотя бы следующее: допустим есть макрос macro, который принимает некоторую форму и раскрывается в aif, подставляяя эту форму в качестве ветки. Далее мы делаем следующий вызов: (let ((it 'foo)) (macro (display it)). результат макроэкспанда должен быть какой-то такой (let ((it 'foo)) (aif 10 (display it) (begin)). Должно вывести 'foo. При этом вызов (macro (display it)) должен быть корректным и вывести 10. отредактировал(а) Kergan: 2012-08-16 08:54 GMT+3 часа(ов) |
|
misha![]()
1275 сообщений |
#6615 2012-09-25 15:35 GMT+3 часа(ов) |
ЦитатаПопробуйте доказать обратное. ЦитатаНу, почему же? Большинство реализаций предлагает дополнительные средства для более "тонкой" настройки синтаксического объекта. ЦитатаНапример, у рэкета всегда можно вытащить из ядра необходимые функции. ЦитатаСейчас стало модно использовать макропараметры, поэтому они присутствуют в большинстве продвинутых реализаций схемы. Так что их применение способствует написанию переносимого кода. Кстати, об этом вы забыли упомянуть ![]() Цитата (define-syntax (aif stx) |
|