Предыдущая страница [1] > 2 <

Автор Сообщение

misha

Moderators


Статус

1273 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#6448   2012-08-10 20:27 GMT+3 часа(ов)      
Цитата
если мы не используем иизкоуровневые средства преобразования, то у нас есть определенные гарантии
Как раз трансформеры (rename, set!) являются такими же низкоуровневыми средствами, как и datum->syntax.
Цитата
То есть низкоуровневые средства стоит применять тогда, когда их применение обосновано - то есть задача без них либо не решается, либо решение без них _значительно_ сложнее/длиннее/более трудно поддерживаемо/менее понятно.
Кто бы спорил Некоторой гарантией эффективности использования datum->syntax являются сами библиотеки рэкета.
Цитата
Синтаксические параметры лишены этого ограничения
Для правильной работы rename-transformer необходимо, чтобы id-stx принадлежал к определенному контексту, а иначе может появится несвязанный идентификатор.

misha

Moderators


Статус

1273 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#6449   2012-08-10 20:34 GMT+3 часа(ов)      
Цитата
первый вариант модифицируется до предложенного синтаксиса безо всяких проблем путем исправления пары строк.
Предложенный синтаксис не читабелен
Цитата
только вместо begin луяше использовать другой биндинг, switch-begin
какой-нибудь.
А зачем перегружать синтаксис? Пусть будет
(with-cycle id e (switch e1 e2 ...) ...)

Kergan

Members


Статус

300 сообщений

Где: ---
Род занятий:
Возраст:

#6450   2012-08-10 20:57 GMT+3 часа(ов)      
Цитата
Как раз трансформеры (rename, set!) являются такими же низкоуровневыми средствами, как и datum->syntax.

нет не являются

Цитата
Кто бы спорил Некоторой гарантией эффективности использования datum->syntax являются сами библиотеки рэкета.

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

Цитата
Для правильной работы rename-transformer необходимо, чтобы id-stx принадлежал к определенному контексту, а иначе может появится несвязанный идентификатор.

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

Цитата
Предложенный синтаксис не читабелен

зачем же ты его предлагал?

Цитата
А зачем перегружать синтаксис? Пусть будет
да, можно и так.
вообще можно и сам begin хитро перегрузить (чтобы никто не заметил), но мало ли - вдруг аукнется
Например какой-нибудь макрос который будет расчитывать на этот begin его в новом begin'e не увидит - биндинг другой.

misha

Moderators


Статус

1273 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#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
(begin
(display 1)
(display 2))
(begin
(display 3)
(display 4))
(begin
(display 5)))

Kergan

Members


Статус

300 сообщений

Где: ---
Род занятий:
Возраст:

#6455   2012-08-12 15:02 GMT+3 часа(ов)      
Цитата
Являются, т.к. они часть ядра.

Ну и что? Важно, что они дают гарантии корректности.

Цитата
Не факт, ибо datum->syntax довольно часто используется в библиотеках, поэтому практически любой баг будет обнаружен очень быстро.

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

Цитата
Да и баги в простых функция встречаются довольно редко.

Да нет, речь о том что мы сами баг посадим.

Цитата
Ну, например, когда контекст id вообще не из той оперы

то есть при использовании datum->syntax
Я и говорю - как только вы начинаете использовать низкоуровневые средситва - прощайтесь с четкостью и прозрачностью макрлэкспанда.

Цитата
Оговорился, ранее предложенный А может лучше так?

можно и так, только begin поменять на что-то другое. Лучше switch вместо него оставить.

misha

Moderators


Статус

1273 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#6456   2012-08-12 21:14 GMT+3 часа(ов)      
Цитата
Ну и что? Важно, что они дают гарантии корректности.
Так и datum->syntax дает гарантию корректности.
Цитата
Ну я и говорю, в библиотеках это баг же изсправлен, а мы его повторим во время придумывания собственного велосипеда.
Ну, не факт. Хотя я не отрицаю, все может быть Отладка покажет.
Цитата
то есть при использовании datum->syntax
Я и говорю - как только вы начинаете использовать низкоуровневые средситва - прощайтесь с четкостью и прозрачностью макрлэкспанда.
Дело не в низкоуровневых средствах(макротрансформеры ведь тоже низкоуровневые), просто для корректности необходимо подставлять идентификатор(синтаксический объект) с правильным контекстом.
Цитата
можно и так, только begin поменять на что-то другое. Лучше switch вместо него оставить.
А мне оба нравятся

Kergan

Members


Статус

300 сообщений

Где: ---
Род занятий:
Возраст:

#6457   2012-08-12 21:43 GMT+3 часа(ов)      
Цитата
А мне оба нравятся

тут дело не в эстетических предпочтениях а в том, что биндинг begin уже занят.

Цитата
Так и datum->syntax дает гарантию корректности.

нет, не дает, т.к. это низкоуровневое средство.

Цитата
Дело не в низкоуровневых средствах(макротрансформеры ведь тоже низкоуровневые)

нет, не никзуровневые. они выражаются через datum->syntax.

Цитата
просто для корректности необходимо подставлять идентификатор(синтаксический объект) с правильным контекстом.

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

misha

Moderators


Статус

1273 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#6461   2012-08-14 23:32 GMT+3 часа(ов)      
Цитата
тут дело не в эстетических предпочтениях а в том, что биндинг begin уже занят.
Как раз begin используется по назначению
(with-cycle id e1 e2 ...)

Цитата
нет, не дает, т.к. это низкоуровневое средство.
Как и трансформеры
Цитата
нет, не никзуровневые. они выражаются через datum->syntax.
Кто выражается? Трансформер - это объект, участвующий в экспанде. Из него "извлекается" функция для преобразования синтаксического объекта. А так как эта функция может быть составлена пользователем, то в ней может содержаться все что угодно, хоть datum->syntax.
Цитата
чтобы этих ситуация избежаьт придется заново изобрести все те самые высокоуровневые средства и выражать макрос через них.
Какие именно?

Kergan

Members


Статус

300 сообщений

Где: ---
Род занятий:
Возраст:

#6462   2012-08-14 23:54 GMT+3 часа(ов)      
Цитата
Как раз begin используется по назначению

А да, не посмотрел на паттерн.

Цитата
Как и трансформеры

Нет.

Цитата
А так как эта функция может быть составлена пользователем, то в ней может содержаться все что угодно, хоть datum->syntax.

ну да, может. но пока вы туда datum->syntax не насовали, вам макросистема гарантирует, что "все будет хорошо". Как только насуете - никаких гарантий нет. Я бы даже сказал, есть гарантии, что в некоторых случаях ничего хорошего уже не будет.

Цитата
Какие именно?

Да те самые syntax-case/rules.

misha

Moderators


Статус

1273 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#6463   2012-08-15 13:03 GMT+3 часа(ов)      
Что делает трансформеры высокоуровневыми?
Цитата
ну да, может. но пока вы туда datum->syntax не насовали, вам макросистема гарантирует, что "все будет хорошо".
Забыли ваш опус про чужие макросы. Например, макросы рэкета частенько используют datum->syntax, но это не делает их грязными.
Цитата
Да те самые syntax-case/rules.
А зачем их придумывать? Это же базовые вещи.

Kergan

Members


Статус

300 сообщений

Где: ---
Род занятий:
Возраст:

#6464   2012-08-15 13:37 GMT+3 часа(ов)      
Цитата
Что делает трансформеры высокоуровневыми?

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

Цитата
Например, макросы рэкета частенько используют datum->syntax, но это не делает их грязными.

Макросы racket вообще все используют datum->syntax, потому что #' выражается через datum->syntax. Но это низкоуровневые детали реализации - нам спецификация гарантирует, что эти datum->syntax использованы корректно. Если же окажется, что это не так - то перед нами баг стандартной библиотеки. Теперь вопрос на засыпку - где чаще встречаются баги, в стандартной библиотеке или в самописных велосипедах?

Цитата
А зачем их придумывать?

Не зная. Вы же это предлагаете (писать ручные datum->syntax, что сводится к переизобретению syntax-case/rules)

misha

Moderators


Статус

1273 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#6465   2012-08-15 14:44 GMT+3 часа(ов)      
Цитата
Гарантии того, что все будет работать корреткно, очевидно же. Это достигается за счет инкапсуляции более низкоуровневых конструкций.
Снова вы про какие-то гарантии. Вы же сами уже писали, что от ошибок никто не застрахован. Все зависит от разработчика этого трансформера, и используемых библиотек.
Почему трансформеры низкоуровневые? Трансформер - это базовая структура, которая обрабатывается во время экспанда. Трансформеры являются такими же базовыми структурами макросистемы, как и синтаксический объект.
Цитата
Макросы racket вообще все используют datum->syntax, потому что #' выражается через datum->syntax.
#' - это короткая форма для syntax. datum->syntax используют самописные ридеры, а базовые обычно используют еще более низкоуровневую функцию.
Цитата
Теперь вопрос на засыпку - где чаще встречаются баги, в стандартной библиотеке или в самописных велосипедах?
Вы так или иначе пишите велосипед - функцию-обработчик макротрансформера.
Цитата
Вы же это предлагаете (писать ручные datum->syntax, что сводится к переизобретению syntax-case/rules)
Нет, не предлагаю. Пусть каждый использует то, что он считает нужным.

отредактировал(а) misha: 2012-08-15 14:58 GMT+3 часа(ов)

Kergan

Members


Статус

300 сообщений

Где: ---
Род занятий:
Возраст:

#6466   2012-08-15 17:54 GMT+3 часа(ов)      
Цитата
Снова вы про какие-то гарантии. Вы же сами уже писали, что от ошибок никто не застрахован.

а может вообще процессор перегреться.

Цитата
Почему трансформеры низкоуровневые? Трансформер - это базовая структура, которая обрабатывается во время экспанда. Трансформеры являются такими же базовыми структурами макросистемы, как и синтаксический объект.

мы видимо о разных вещах говорим. вы что под трансформерами понимаете?

Цитата
#' - это короткая форма для syntax. datum->syntax используют самописные ридеры, а базовые обычно используют еще более низкоуровневую функцию.

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

Цитата
Вы так или иначе пишите велосипед - функцию-обработчик макротрансформера.

вы занимаетесь казуистикой. еще раз - когда вы используете высокоуровневые средства типа шаблонов, синтаксических параметров, rename-transformer;ов и т.п., то разработчиками стандартной библиотеки вам гарантируется корректность. Ошибка в этом случае будет ошибкой ф-й стандартной библиотеки и только ее. Если вы только в своем трансформере решили явно использовать datum->syntax - никаких гарантий стандартная либа вам уже не дает, чтобы эти гарантии получить вам надо эту стандартную либо переизобрести.

Цитата
Нет, не предлагаю. Пусть каждый использует то, что он считает нужным.

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

misha

Moderators


Статус

1273 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#6468   2012-08-15 19:38 GMT+3 часа(ов)      
Цитата
мы видимо о разных вещах говорим. вы что под трансформерами понимаете?
Видимо. О трансформерах я уже писал выше.
Цитата
угу, а syntax может иметь внутре шаблонные переменные, подстановка которых выражается через datum->syntax
Странный юмор.
Цитата
Вообще когда мы конструируем некоторый синтаксический объект из других, то никакого способа сделать это, кроме использования datum->syntax, не существует.
Пользователю обычно запрещают использовать еще более низкоуровневые средства.
Цитата
Если вы только в своем трансформере решили явно использовать datum->syntax - никаких гарантий стандартная либа вам уже не дает
Вот именно.
Цитата
то етсь отсутствие datum->syntax всегда лучше его присутствия и этого присутствия надо избегать, пока возможно.
Мне понятен ваш страх перед datum->syntax. Но его ведь обычно и используют для написания анафорических макросов на r6rs.

Kergan

Members


Статус

300 сообщений

Где: ---
Род занятий:
Возраст:

#6469   2012-08-15 21:01 GMT+3 часа(ов)      
Цитата
Видимо. О трансформерах я уже писал выше.

нет не писал

Цитата
Странный юмор.


это не юмр а продолжение вашей логики

Цитата
Пользователю обычно запрещают использовать еще более низкоуровневые средства.

это вы про что?

Цитата
Вот именно.

так об этом изначально и речь. не стоит использовать datum->syntax, если это не обосновано.

Цитата
Мне понятен ваш страх перед datum->syntax. Но его ведь обычно и используют для написания анафорических макросов на r6rs.

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

misha

Moderators


Статус

1273 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#6470   2012-08-15 21:26 GMT+3 часа(ов)      
Цитата
нет не писал
"Трансформер - это базовая структура, которая обрабатывается во время экспанда."
"Из него "извлекается" функция для преобразования синтаксического объекта."
Цитата
это не юмр а продолжение вашей логики
Где вы увидели логику? Может хватит уже придумывать.
Цитата
это вы про что?
См. исходники любой реализации r6rs.
Цитата
а если синтаксические параметры есть - то лучше использовать их, согласитесб?
Если это не вызовет проблем, то почему бы и нет.

Kergan

Members


Статус

300 сообщений

Где: ---
Род занятий:
Возраст:

#6471   2012-08-15 22:13 GMT+3 часа(ов)      
Цитата
"Трансформер - это базовая структура, которая обрабатывается во время экспанда."
"Из него "извлекается" функция для преобразования синтаксического объекта."

ну вэтом определении трансформеры могут ыть низкуровневыми и высокоуровневыми.

Цитата
Где вы увидели логику?

то етсь в ваших словах не было логики?

Цитата
См. исходники любой реализации r6rs.

клнкртенее

Цитата
Если это не вызовет проблем, то почему бы и нет.

так в том и дело, что проблемы вызывает datum->syntax, а не параметры

misha

Moderators


Статус

1273 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#6472   2012-08-15 23:31 GMT+3 часа(ов)      
Цитата
ну вэтом определении трансформеры могут ыть низкуровневыми и высокоуровневыми.
"Трансформеры являются такими же базовыми структурами макросистемы, как и синтаксический объект."
Цитата
то етсь в ваших словах не было логики?
Я не знаю, что вы там себе напридумывали, поэтому и спросил о какой логике идет речь. Во избежание проблем макрос syntax обычно реализуют с использованием более низкоуровневых средств, чем datum->syntax.
Цитата
клнкртенее
Помимо datum->syntax могут существовать другие еще более низкоуровневые функции для создания синтаксического объекта.
Цитата
так в том и дело, что проблемы вызывает datum->syntax, а не параметры
Параметры нужно использовать для создания "глобальных" макросов общего назначения, а не для создания простеньких анафорических макросов.

Kergan

Members


Статус

300 сообщений

Где: ---
Род занятий:
Возраст:

#6473   2012-08-16 07:47 GMT+3 часа(ов)      
Цитата
"Трансформеры являются такими же базовыми структурами макросистемы, как и синтаксический объект."

и?

Цитата
Во избежание проблем макрос syntax обычно реализуют с использованием более низкоуровневых средств, чем datum->syntax.

Более низкоуровневых средств нет - в том смысле, что все, что мы можем сделать, мы можем сделать через datum->syntax. Как оно реализуется в том или ином случае на практике - уже не важно.

Цитата
Помимо 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

Moderators


Статус

1273 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#6615   2012-09-25 15:35 GMT+3 часа(ов)      
Цитата
и?
Попробуйте доказать обратное.
Цитата
Более низкоуровневых средств нет - в том смысле, что все, что мы можем сделать, мы можем сделать через datum->syntax. Как оно реализуется в том или ином случае на практике - уже не важно.
Ну, почему же? Большинство реализаций предлагает дополнительные средства для более "тонкой" настройки синтаксического объекта.
Цитата
например?
Например, у рэкета всегда можно вытащить из ядра необходимые функции.
Цитата
Параметры нужно использовать во всех случаях, когда надо ввести анафору.
Сейчас стало модно использовать макропараметры, поэтому они присутствуют в большинстве продвинутых реализаций схемы. Так что их применение способствует написанию переносимого кода. Кстати, об этом вы забыли упомянуть
Цитата
Попробуйте хотя бы банальный aif написать так, чтобы он просто _работал_. Переизобретете параметры в итоге.
Под "работал" я понимаю хотя бы следующее: допустим есть макрос macro, который принимает некоторую форму и раскрывается в aif, подставляяя эту форму в качестве ветки. Далее мы делаем следующий вызов: (let ((it 'foo)) (macro (display it)). результат макроэкспанда должен быть какой-то такой (let ((it 'foo)) (aif 10 (display it) (begin)). Должно вывести 'foo. При этом вызов (macro (display it)) должен быть корректным и вывести 10.
(define-syntax (aif stx)
(syntax-case stx ()
([_ e1 e2 e3]
(with-syntax ([it (syntax-local-get-shadower (syntax-local-introduce #'it))])
#'(let ([t e1])
(let-syntax ([it (make-rename-transformer #'t)])
(if t e2 e3)))))))


Онлайн :

0 пользователь(ей), 26 гость(ей) :




Реклама на сайте: