Автор | Сообщение |
snv
25 сообщений |
#7038 2013-05-30 03:03 GMT+3 часа(ов) |
Существует два пути реализации макросов:
1. macroexpand функцией (Common Lisp) 2. с помощью syntax трансформеров, практически реализующих дополнительный язык поверх Lisp (Scheme) macroexpand ведёт к конфликту между идентификаторами, когда, например, (defmacro let (…) …) сломает все стандартные макросы использующие let. Т.е. мы лишаемся возможности иметь свой персональный let. syntax transformers чрезмерно усложняют семантику языка. Я предлагаю третий путь: пусть каждый макрос использует свой собственный, локальный, макро-экспандер, раскрывающий только известные его контексту макросы. |
|
The hour will come in which all the peoples of the earth will awake, and the Jews will be the victims. -- Joseph Goebbels, 21 January 1945
|
|
Aoloa
37 сообщений |
#7039 2013-05-30 18:45 GMT+3 часа(ов) |
Совершенно не понимаю, что Вы тут предлагаете.
Но по-моему Вы путаете syntax-rules (с их дополнительным языком) и macro-transformer’ы (см. описание в schemewiki). А ещё многие Схемы вместо macro-transformer’ов используют макросы с синтаксическими объектами (SRFI 72). |
|
With iTeX* your entire life can be encapsulated into a dynamic hyperdocument, downloadable by anybody you designate (Donald E. Knuth, An Earthshaking Announcement)
|
|
snv
25 сообщений |
#7040 2013-05-30 20:21 GMT+3 часа(ов) |
Цитата Я предлагаю резолвить идентификаторы на момент вызова макроса (т.е. беря значения из его лексического окружения). Возможно даже прямо в quasiquote. Например, в моём диалекте Lisp (Symta), оператор `+` определяется как
`form T` - гибрид with-gensyms и quasiquote, дающий T как (let ((T (gensym "T")) ...) и заменяющий все символы начинающиеся со строчной буквы их значениями. Символы начинающиеся с заглавной - переменные, как в Prolog, и берутся из окружения. Имеем простую гигиену и отсуствие лишнего боилерплейта, типа `(,A add ,B). Пример работы ридера:
Цитата Так или иначе, они концептуально слишком сложны. Макросы перестают быть простыми функциями. |
|
The hour will come in which all the peoples of the earth will awake, and the Jews will be the victims. -- Joseph Goebbels, 21 January 1945
|
|
Aoloa
37 сообщений |
#7042 2013-05-31 21:53 GMT+3 часа(ов) |
Я не очень понимаю Ваш диалект и Ваши примеры, извините если что скажу не так.
Цитата Насколько я понимаю, Ваши макросы основным недостатком syntax-case: невозможно уйти от гигены. Существуют ситуации, когда нужно нарушить гигиену (классический пример — анафорические макросы). Цитата Вряд ли Вы придумаете что-то проще за ir-macro-transformer. |
|
With iTeX* your entire life can be encapsulated into a dynamic hyperdocument, downloadable by anybody you designate (Donald E. Knuth, An Earthshaking Announcement)
|
|
snv
25 сообщений |
#7043 2013-05-31 23:55 GMT+3 часа(ов) |
Цитата В моих макросах можно уйти от гигиены: достаточно указать form какие символы я хочу взять из среды вызвавшей макрос. Например, имплементация анафорического if aif KeyForm Then Else => form \It | It = KeyForm | if It Then Else Прошу заметить, что в моём диалекте макросы - обычные функции, просто экспортируемые с флагом "macro". Это одновременно избавляет нас от сумасшедшего eval-when, упрощает тестирование (макрос может быть вызван как обычная функция) и принуждает к модульности. Цитата Там слишком сложно У меня (if и let берутся из текущего окружения, It - из окружения пользователя):
У них:
|
|
The hour will come in which all the peoples of the earth will awake, and the Jews will be the victims. -- Joseph Goebbels, 21 January 1945
|
|
Aoloa
37 сообщений |
#7044 2013-06-01 00:20 GMT+3 часа(ов) |
Цитата А если список символов, которые должны быть негигиеничны, должен определяться по ходу работы макроса? |
|
With iTeX* your entire life can be encapsulated into a dynamic hyperdocument, downloadable by anybody you designate (Donald E. Knuth, An Earthshaking Announcement)
|
|
snv
25 сообщений |
#7045 2013-06-01 05:43 GMT+3 часа(ов) |
Цитата В `form` можно любые символы засунуть. А `form 'It` - просто шорткат, чтобы не пришлось всюду уродоливые запятые ставить, в стиле (if ,'It ,Then ,Else), я единожды указываю, что символ негигиеничный. |
|
The hour will come in which all the peoples of the earth will awake, and the Jews will be the victims. -- Joseph Goebbels, 21 January 1945
|
|
Kergan
300 сообщений |
#7049 2013-06-06 05:11 GMT+3 часа(ов) |
Цитата поздравляю, золотце, ты придумал обычные гигиенические макросы. в точности так они и работают, чтобы let в старых макросах работал корректно. Цитата ты только что сам описал алгоритм работы гигиены. что же там сложного? |
|
Kergan
300 сообщений |
#7050 2013-06-06 05:14 GMT+3 часа(ов) |
Цитата зачем говорить о том, о чем не знаешь? в syntax-case гигиена легко и просто снимается. проще, чем накладывается через генсим. |
|
Kergan
300 сообщений |
#7051 2013-06-06 05:29 GMT+3 часа(ов) |
Цитата (define-simple-macro (aif pred then else) |
|
Kergan
300 сообщений |
#7052 2013-06-06 05:30 GMT+3 часа(ов) |
Цитата а теперь ты переизобрел макросистему scheme. |
|
snv
25 сообщений |
#7054 2013-06-06 09:12 GMT+3 часа(ов) |
Цитата Вруша же! Схемовские макросы работают иначе, возвращая syntax-object, а мои возвращают обычный список и работают с тупыми строками (ибо символов моём диалекте Lisp нет, как и пакетов). В случае твоего define-simple-macro, тело макроса вообще не позволяет вычисления и надо собачить непонятный бред, вроде #:with It (syntax-local-introduce #'it) Цитата Мой алгоритм просто вешает на адреса всех lowercase строк ссылку на соответствующую им функцию на момент их рождения. Схемовский работает через всякие "фазы" и прочую синтаксическую космонавтику, одно описание которой занимает несколько научных публикаций. |
|
The hour will come in which all the peoples of the earth will awake, and the Jews will be the victims. -- Joseph Goebbels, 21 January 1945
|
|
Kergan
300 сообщений |
#7055 2013-06-07 07:38 GMT+3 часа(ов) |
Цитата именно так как ты описал они и работают Цитата это только в некоторых реализациях. ну и это ничего не усложняет, синтаксический объект ничем не отличается от списка по сути. > тело макроса вообще не позволяет вычисления У тебя тоже. > и надо собачить непонятный бред, вроде #:with It (syntax-local-introduce #'it) Так ты такой же непонятный бред собачишь в своем примере. Один в один. Никаких, даже малейших отличий нет. Цитата Еще раз поздравляю - ты в точности изобрел алгоритм гигиены. Хотя я об этом вроде говорил уже? Цитата Это все исключительно твои фантазии. Гигиена никак не связана ни с фазами, ни с прочей синтаксической космонавтикой. |
|
snv
25 сообщений |
#7057 2013-06-07 21:18 GMT+3 часа(ов) |
Цитата Не так же! В Scheme (define-syntax macro-name (syntax-rules () ...)) А у меня простая (defun macro-name (&rest args) ...) Цитата У меня макросы - обычные функции. Цитата Гигиена связана с фазой компиляции. Из гигиены же растут Схемовские define-for-syntax и begin-for-syntax Мне это всё очень сложно, посему я изобретаю свой язык. >Так ты такой же непонятный бред собачишь в своем примере. Один в один. Никаких, даже малейших отличий нет. обоснуй Цитата обоснуй Цитата Усложняет. Common Lisp: defmacro --------------- Scheme: begin-for-syntax syntax-e syntax->datum syntax->list syntax-property #' (void) quote-syntax datum->syntax syntax-parameter-value syntax-rule raise-syntax-error internal-definition-context? syntax-parameterize make-set!-transformer prop:set!-transformer free-identifier=? syntax-local-value/immediate syntax-local-transforming-module-provides? syntax-local-module-defined-identifiers syntax-local-module-required-identifiers make-require-transformer (require (lib "stxparam.ss" "mzlib")) syntax? (require mzlib/defmacro) define-macro syntax-local-lift-expression (require racket/stxparam-exptime) make-rename-transformer syntax-local-require-certifier make-parameter-rename-transformer syntax-local-value define-syntax-parameter make-provide-transformer syntax-local-provide-certifier syntax-source local-expand/capture-lifts local-transformer-expand/capture-lifts syntax-local-lift-values-expression syntax-local-lift-module-end-declaration syntax-local-lift-require syntax-local-lift-provide syntax-local-name syntax-local-context syntax-local-phase-level syntax-local-module-exports syntax-local-get-shadower syntax-local-certifier syntax-transforming? syntax-local-introduce make-syntax-introducer exn:fail:syntax make-syntax-delta-introducer syntax-local-make-delta-introducer syntax-case define-syntax syntax-rules with-syntax syntax-position syntax-line syntax-column ... |
|
The hour will come in which all the peoples of the earth will awake, and the Jews will be the victims. -- Joseph Goebbels, 21 January 1945
|
|
misha![]()
1275 сообщений |
#7058 2013-06-08 02:52 GMT+3 часа(ов) |
ЦитатаКаким образом? ЦитатаА разве это не попытка переизобрести макротрансформеры? |
|
misha![]()
1275 сообщений |
#7059 2013-06-08 03:13 GMT+3 часа(ов) |
ЦитатаКаким боком механизм перезаписи термов упрощает семантику языка? ЦитатаКак уже меня достали эти минималисты ![]() ЦитатаКак и в scheme! ЦитатаЭто шутка? |
|
misha![]()
1275 сообщений |
#7060 2013-06-08 03:23 GMT+3 часа(ов) |
Кстати, зачем превращать лисп в недодилан?
|
|
Kergan
300 сообщений |
#7061 2013-06-08 09:18 GMT+3 часа(ов) |
Цитата так же. просто ты не знаешь. Цитата и в чем разница? и там и там определяется обычная функция. Цитата как и в схемке. Цитата нет, никак не связана Цитата нет, здесь нету никакой связи, абсолютно. гигиена и phase separation полностью независимые концепты, одно вполне работает без другого. Цитата очевидно Цитата тоже очевидно Цитата нет Цитата ну это ложь. правильно вот так: Цитата а если уж приводишь все ф-и для макросов - то и для CL их приводи. |
|
snv
25 сообщений |
#7062 2013-06-08 15:27 GMT+3 часа(ов) |
Цитата Я не знаю, что такое макротрансформеры Цитата Цитата http://axisofeval.blogspot.ru/2010/07/whats-phase-separation-and-when-do-you.html Связана. Цитата В Scheme у тебя define-syntax. Цитата Вот и я о том, что в Схемке сложная compile-time семантика. Цитата Symta (сохранить в фаил cons.sy): car => Args.0 cdr => Args.1 Lisp (defun cons (CAR CDR) (lambda (what) (cond ((eql what 'car) CAR) ((eql what 'cdr) CDR) (t (error "cons: method ~a is unsupported" what))))) Цитата Твоя "функция" даже аргументов не берёт. Цитата define "очевидно" Цитата Для CL есть только defmacro А Схемка захлебывается в begin-for-syntax syntax-e syntax->datum syntax->list syntax-property #' (void) quote-syntax datum->syntax syntax-parameter-value syntax-rule raise-syntax-error internal-definition-context? syntax-parameterize make-set!-transformer prop:set!-transformer free-identifier=? syntax-local-value/immediate syntax-local-transforming-module-provides? syntax-local-module-defined-identifiers syntax-local-module-required-identifiers make-require-transformer (require (lib "stxparam.ss" "mzlib")) syntax? (require mzlib/defmacro) define-macro syntax-local-lift-expression (require racket/stxparam-exptime) make-rename-transformer syntax-local-require-certifier make-parameter-rename-transformer syntax-local-value define-syntax-parameter make-provide-transformer syntax-local-provide-certifier syntax-source local-expand/capture-lifts local-transformer-expand/capture-lifts syntax-local-lift-values-expression syntax-local-lift-module-end-declaration syntax-local-lift-require syntax-local-lift-provide syntax-local-name syntax-local-context syntax-local-phase-level syntax-local-module-exports syntax-local-get-shadower syntax-local-certifier syntax-transforming? syntax-local-introduce make-syntax-introducer exn:fail:syntax make-syntax-delta-introducer syntax-local-make-delta-introducer syntax-case define-syntax syntax-rules with-syntax syntax-position syntax-line syntax-column ... |
|
The hour will come in which all the peoples of the earth will awake, and the Jews will be the victims. -- Joseph Goebbels, 21 January 1945
|
|
Kergan
300 сообщений |
#7063 2013-06-08 16:04 GMT+3 часа(ов) |
Цитата и где в твой ссылке хоть слово о связи гигиены с фазами? Ты сам-то ссылку читал? Цитата Который работает в точности как defmacro, да. Только называется по-другому. Цитата Берет. (define-synatx (yoba stx) ...), вот stx - аргумент. Цитата Ну напиши мне хоть один макрос, который использует только defmacro. |
|
snv
25 сообщений |
#7064 2013-06-08 21:17 GMT+3 часа(ов) |
Цитата Читал. "This is another concept, like hygiene, that is only now (or just recently) becoming understood by the peoples." Цитата (define-syntax id expr) creates a transformer binding (see Transformer Bindings) of id with the value of expr, which is an expression at phase level 1 relative to the surrounding context. (defmacro name lambda-list form*) defines name as a macro by associating a macro function with that name in the global environment. The macro function is defined in the same lexical environment in which the defmacro form appears. в каком месте они работают так же? Цитата Возьмём пример с http://docs.racket-lang.org: (define-syntax foo (syntax-rules () ((_ a ...) (printf "~a\n" (list a ...))))) где тут аргументы? Цитата (defmacro один-макрос (a b) (list b a)) |
|
The hour will come in which all the peoples of the earth will awake, and the Jews will be the victims. -- Joseph Goebbels, 21 January 1945
|
|
misha![]()
1275 сообщений |
#7065 2013-06-08 22:55 GMT+3 часа(ов) |
Цитатану, все... приехали ![]() ЦитатаСлышу звон, да не знаю, где он ![]() ЦитатаОн работает аналогично defmacro. См. http://www.lisp.ru/forums.php?m=posts&q=709 ЦитатаКак и в CL. ЦитатаИ все-таки зачем превращать лисп в подобие дилана? ЦитатаУ макроса может быть всего один аргумент - синтаксический объект. Что может быть проще? ЦитатаЭто дополнения из Рэкета, упрощающие написание "правильных" макросов. См. стандарт r6rs. |
|
misha![]()
1275 сообщений |
#7066 2013-06-08 23:08 GMT+3 часа(ов) |
ЦитатаСм. стандарт. Цитатаsyntax-rules - макрос |
|
snv
25 сообщений |
#7067 2013-06-09 05:09 GMT+3 часа(ов) |
Цитата что же делать? Цитата http://docs.racket-lang.org/reference/syntax-model.html#%28tech._transformer._binding%29 >bindings in phase level 1 constitute the transformer environment. т.е. макросы (transformer environment) прямо связаны с фазами Цитата В CL один defmacro Цитата Причём тут дилан? Цитата В таком случае твой "макрос" - не обычная функция. Настоящие Лисповские Макросы™ - это обычные функции, аргументы которым передаются как есть. Цитата В обычной Схеме нет syntax-object? Цитата А define-syntax тогда что? Откуда syntax-rules берёт исходный SEXP? |
|
The hour will come in which all the peoples of the earth will awake, and the Jews will be the victims. -- Joseph Goebbels, 21 January 1945
|
|
misha![]()
1275 сообщений |
#7068 2013-06-09 14:00 GMT+3 часа(ов) |
ЦитатаРешай сам ![]() ЦитатаКак и в CL, разница лишь в том, что в CL отсутствует четкое разделение по фазам. Т.е. в CL можно создавать собственные вложенные фазы (псевдофазы) с помощью eval-when. В CL "phase level 1" именуется как стадия "macro expansion". Цитатаdefmacro - это удобный макрос, создающий макротрансформер и добавляющий его в environment. ЦитатаПросто твоя макросистема смахивает на дилановскую. ЦитатаКак раз самая обычная, т.е. любую функцию принимающую один аргумент можно использовать как макрос. А в CL есть договоренность насчет параметров, короче, макрос может принимать дополнительные параметры в отличие от обычной функции. А почему так? Да просто синтаксический объект уже содержит все, что нам нужно! Т.е. нет нужды модифицировать local environment, как в случае с CL. (Ищи грязные макрохаки для CL) ЦитатаИ в чем разница? ЦитатаТам все гораздо примитивнее. Т.е. с синтаксическим объектом работать не так удобно, как в рэкете. ЦитатаСтандартная форма, тогда как defmacro является макросом. Цитатаsyntax-rules создает функцию, которая парсит синтаксический объект в соответствии с образцом. |
|
snv
25 сообщений |
#7069 2013-06-10 04:23 GMT+3 часа(ов) |
Цитата |
|
The hour will come in which all the peoples of the earth will awake, and the Jews will be the victims. -- Joseph Goebbels, 21 January 1945
|
|
Kergan
300 сообщений |
#7070 2013-06-10 10:40 GMT+3 часа(ов) |
Цитата и где тут про связь фаз с гигиеной? Цитата во всех ты же сам спецификация прочитал. там для define-syntax и defmacro одно и то же написано только разными словами Цитата он здесь не указан. в схеме можно определять функции, не указывая аргументы (point-free) Цитата ты тут еще какой-то list используешь. это слишком сложно, давай без него - только defmacrо, только хардкор |
|
Kergan
300 сообщений |
#7071 2013-06-10 10:48 GMT+3 часа(ов) |
Цитата макросы связаны. а гигиена - нет Цитата а в схеме один define-syntax Цитата обычная функция Цитата ну так в схеме они именно так и передаются Цитата стандарт не требует Цитата тоже макрос, как дефмакро Цитата ниоткуда не берет. ему и не надо Цитата не обязательно функцию, кстати. можно де и просто сделать (define-syntax yoba 1) |
|
Kergan
300 сообщений |
#7072 2013-06-10 10:58 GMT+3 часа(ов) |
Цитата для удобства. но никто не заставляет тебя использовать что-то кроме него. дефмакро в схеме тоже есть же. Цитата так вот define-syntax это и есть такой флаг. (define-syntax yoba body) значит "присвоить yoba значение формы body и трактовать идентификатор yoba как макрос" а body уже может быть чем угодно - например функцией, которая принимает синтаксический объект и возвращает синтаксический объект (макрос). Цитата всем Цитата так от нее уже давно все ушли. плохая семантика же. неудобная, негибкая. Цитата на самом деле их всего две: datum->syntax и syntax-e. для разбора и построения снитаксических объектов никаких ф-й больше не надо. Цитата нету никакой путаницы Цитата почему нельзя? можно. |
|
snv
25 сообщений |
#7075 2013-06-10 23:53 GMT+3 часа(ов) |
Цитата Где это ты видел Lisp без списков? Цитата Тогда зачем syntax-case? Цитата define "все" Цитата И как получить значение этого yoba? Например, #'let выдаёт некий #<syntax:3:4 let> - что с ним делать? |
|
The hour will come in which all the peoples of the earth will awake, and the Jews will be the victims. -- Joseph Goebbels, 21 January 1945
|