Следующая страница > 1 < [2]

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

snv

Members


Статус

25 сообщений
http://sym.at.ua/load
Где: Russia Серпухов
Род занятий: Безработный
Возраст: 31

#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

Members


Статус

37 сообщений

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

#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

Members


Статус

25 сообщений
http://sym.at.ua/load
Где: Russia Серпухов
Род занятий: Безработный
Возраст: 31

#7040   2013-05-30 20:21 GMT+3 часа(ов)      
Цитата
Aoloa :
Совершенно не понимаю, что Вы тут предлагаете.

Я предлагаю резолвить идентификаторы на момент вызова макроса (т.е. беря значения из его лексического окружения). Возможно даже прямо в quasiquote. Например, в моём диалекте Lisp (Symta), оператор `+` определяется как
 
`+` A B => form T
| T = A add B
| say added A and B giving T
| T
 


`form T` - гибрид with-gensyms и quasiquote, дающий T как (let ((T (gensym "T")) ...) и заменяющий все символы начинающиеся со строчной буквы их значениями. Символы начинающиеся с заглавной - переменные, как в Prolog, и берутся из окружения. Имеем простую гигиену и отсуствие лишнего боилерплейта, типа `(,A add ,B).

Пример работы ридера:
 
SYMTA> (/read "`+` A B => form T | int T = A add B | say added A and B giving T | T")
("to" (:HEAD "+" "A" "B")
("form" (:HEAD "T") ("my" (:HEAD "int" "T") ("A" "add" "B"))
("say" "added" "A" "and" "B" "giving" "T") ("T")))
SYMTA>
 


Цитата

Но по-моему Вы путаете syntax-rules (с их дополнительным языком) и macro-transformer’ы (см. описание в schemewiki). А ещё многие Схемы вместо macro-transformer’ов используют макросы с синтаксическими объектами (SRFI 72).


Так или иначе, они концептуально слишком сложны. Макросы перестают быть простыми функциями.
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

Members


Статус

37 сообщений

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

#7042   2013-05-31 21:53 GMT+3 часа(ов)      
Я не очень понимаю Ваш диалект и Ваши примеры, извините если что скажу не так.

Цитата
Я предлагаю резолвить идентификаторы на момент вызова макроса (т.е. беря значения из его лексического окружения). Возможно даже прямо в quasiquote.

Насколько я понимаю, Ваши макросы основным недостатком 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

Members


Статус

25 сообщений
http://sym.at.ua/load
Где: Russia Серпухов
Род занятий: Безработный
Возраст: 31

#7043   2013-05-31 23:55 GMT+3 часа(ов)      
Цитата
Aoloa :
Насколько я понимаю, Ваши макросы основным недостатком syntax-case: невозможно уйти от гигены.

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

Например, имплементация анафорического if
aif KeyForm Then Else => form \It | It = KeyForm | if It Then Else


Прошу заметить, что в моём диалекте макросы - обычные функции, просто экспортируемые с флагом "macro". Это одновременно избавляет нас от сумасшедшего eval-when, упрощает тестирование (макрос может быть вызван как обычная функция) и принуждает к модульности.


Цитата
Вряд ли Вы придумаете что-то проще за ir-macro-transformer.

Там слишком сложно
У меня (if и let берутся из текущего окружения, It - из окружения пользователя):
 
(symta-macro aif KeyForm Then Else
(form 'It
(let ((It KeyForm))
(if It Then Else))))
 


У них:
 
(define-syntax aif
(er-macro-rules (%let %if)
((_ test then)
`(,%let ((it ,test))
(,%if it ,then)))
((_ test then else)
`(,%let ((it ,test))
(,%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

Aoloa

Members


Статус

37 сообщений

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

#7044   2013-06-01 00:20 GMT+3 часа(ов)      
Цитата

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


А если список символов, которые должны быть негигиеничны, должен определяться по ходу работы макроса?
With iTeX* your entire life can be encapsulated into a dynamic hyperdocument, downloadable by anybody you designate (Donald E. Knuth, An Earthshaking Announcement)

snv

Members


Статус

25 сообщений
http://sym.at.ua/load
Где: Russia Серпухов
Род занятий: Безработный
Возраст: 31

#7045   2013-06-01 05:43 GMT+3 часа(ов)      
Цитата
Aoloa :
А если список символов, которые должны быть негигиеничны, должен определяться по ходу работы макроса?



В `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

Members


Статус

300 сообщений

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

#7049   2013-06-06 05:11 GMT+3 часа(ов)      
Цитата
macroexpand ведёт к конфликту между идентификаторами, когда, например, (defmacro let (…) …) сломает все стандартные макросы использующие let. Т.е. мы лишаемся возможности иметь свой персональный let.

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

Цитата
Так или иначе, они концептуально слишком сложны.

ты только что сам описал алгоритм работы гигиены. что же там сложного?

Kergan

Members


Статус

300 сообщений

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

#7050   2013-06-06 05:14 GMT+3 часа(ов)      
Цитата
Ваши макросы основным недостатком syntax-case: невозможно уйти от гигены.

зачем говорить о том, о чем не знаешь? в syntax-case гигиена легко и просто снимается. проще, чем накладывается через генсим.

Kergan

Members


Статус

300 сообщений

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

#7051   2013-06-06 05:29 GMT+3 часа(ов)      
Цитата
В моих макросах можно уйти от гигиены: достаточно указать form какие символы я хочу взять из среды вызвавшей макрос.


(define-simple-macro (aif pred then else)
#:with It (syntax-local-introduce #'it)
(let ([It pred]) (if It then else)))

Kergan

Members


Статус

300 сообщений

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

#7052   2013-06-06 05:30 GMT+3 часа(ов)      
Цитата
Прошу заметить, что в моём диалекте макросы - обычные функции, просто экспортируемые с флагом "macro". Это одновременно избавляет нас от сумасшедшего eval-when, упрощает тестирование (макрос может быть вызван как обычная функция) и принуждает к модульности.

а теперь ты переизобрел макросистему scheme.

snv

Members


Статус

25 сообщений
http://sym.at.ua/load
Где: Russia Серпухов
Род занятий: Безработный
Возраст: 31

#7054   2013-06-06 09:12 GMT+3 часа(ов)      
Цитата
Kergan :
Цитата
macroexpand ведёт к конфликту между идентификаторами, когда, например, (defmacro let (…) …) сломает все стандартные макросы использующие let. Т.е. мы лишаемся возможности иметь свой персональный let.

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

Вруша же! Схемовские макросы работают иначе, возвращая 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

Members


Статус

300 сообщений

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

#7055   2013-06-07 07:38 GMT+3 часа(ов)      
Цитата
Схемовские макросы работают иначе

именно так как ты описал они и работают

Цитата
возвращая syntax-object

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

> тело макроса вообще не позволяет вычисления

У тебя тоже.

> и надо собачить непонятный бред, вроде #:with It (syntax-local-introduce #'it)

Так ты такой же непонятный бред собачишь в своем примере. Один в один. Никаких, даже малейших отличий нет.

Цитата
Мой алгоритм просто вешает на адреса всех lowercase строк ссылку на соответствующую им функцию на момент их рождения.

Еще раз поздравляю - ты в точности изобрел алгоритм гигиены. Хотя я об этом вроде говорил уже?

Цитата
Схемовский работает через всякие "фазы" и прочую синтаксическую космонавтику

Это все исключительно твои фантазии. Гигиена никак не связана ни с фазами, ни с прочей синтаксической космонавтикой.

snv

Members


Статус

25 сообщений
http://sym.at.ua/load
Где: Russia Серпухов
Род занятий: Безработный
Возраст: 31

#7057   2013-06-07 21:18 GMT+3 часа(ов)      
Цитата
Kergan :
именно так как ты описал они и работают

Не так же!

В 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

Moderators


Статус

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

#7058   2013-06-08 02:52 GMT+3 часа(ов)      
Цитата
syntax transformers чрезмерно усложняют семантику языка.
Каким образом?
Цитата
Я предлагаю третий путь: пусть каждый макрос использует свой собственный, локальный, макро-экспандер, раскрывающий только известные его контексту макросы.
А разве это не попытка переизобрести макротрансформеры?

misha

Moderators


Статус

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

#7059   2013-06-08 03:13 GMT+3 часа(ов)      
Цитата
`+` A B => form T

| T = A add B

| say added A and B giving T

| T
Каким боком механизм перезаписи термов упрощает семантику языка?
Цитата
Схемовские макросы работают иначе, возвращая syntax-object, а мои возвращают обычный список и работают с тупыми строками (ибо символов моём диалекте Lisp нет, как и пакетов).
Как уже меня достали эти минималисты Кстати, в scheme любой объект можно преобразовать в синтаксический.
Цитата
У меня макросы - обычные функции.
Как и в scheme!
Цитата
Гигиена связана с фазой компиляции.
Это шутка?

misha

Moderators


Статус

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

#7060   2013-06-08 03:23 GMT+3 часа(ов)      
Кстати, зачем превращать лисп в недодилан?

Kergan

Members


Статус

300 сообщений

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

#7061   2013-06-08 09:18 GMT+3 часа(ов)      
Цитата
Не так же!

так же. просто ты не знаешь.

Цитата
В Scheme (define-syntax macro-name (syntax-rules () ...))
А у меня простая (defun macro-name (&rest args) ...)

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

Цитата
У меня макросы - обычные функции.

как и в схемке.

Цитата
Гигиена связана с фазой компиляции.

нет, никак не связана

Цитата
Из гигиены же растут Схемовские define-for-syntax и begin-for-syntax

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

Цитата
обоснуй

очевидно

Цитата
обоснуй

тоже очевидно

Цитата
Усложняет.

нет

Цитата
Усложняет.

Common Lisp: defmacro
---------------
Scheme: begin-for-syntax synt...

ну это ложь. правильно вот так:
Цитата

Common Lisp: defmacro
---------------
Scheme: define-syntax

а если уж приводишь все ф-и для макросов - то и для CL их приводи.

snv

Members


Статус

25 сообщений
http://sym.at.ua/load
Где: Russia Серпухов
Род занятий: Безработный
Возраст: 31

#7062   2013-06-08 15:27 GMT+3 часа(ов)      
Цитата
misha :
это не попытка переизобрести макротрансформеры?


Я не знаю, что такое макротрансформеры

Цитата
Это шутка?

Цитата
нет, никак не связана

http://axisofeval.blogspot.ru/2010/07/whats-phase-separation-and-when-do-you.html
Связана.

Цитата
Как и в scheme!

В 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 их приводи.

Для 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

Members


Статус

300 сообщений

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

#7063   2013-06-08 16:04 GMT+3 часа(ов)      
Цитата
Связана.

и где в твой ссылке хоть слово о связи гигиены с фазами? Ты сам-то ссылку читал?

Цитата
В Scheme у тебя define-syntax.

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

Цитата
Твоя "функция" даже аргументов не берёт.

Берет. (define-synatx (yoba stx) ...), вот stx - аргумент.

Цитата
Для CL есть только defmacro

Ну напиши мне хоть один макрос, который использует только defmacro.

snv

Members


Статус

25 сообщений
http://sym.at.ua/load
Где: Russia Серпухов
Род занятий: Безработный
Возраст: 31

#7064   2013-06-08 21:17 GMT+3 часа(ов)      
Цитата
Kergan :
и где в твой ссылке хоть слово о связи гигиены с фазами? Ты сам-то ссылку читал?

Читал. "This is another concept, like hygiene, that is only now (or just recently) becoming understood by the peoples."

Цитата
В Scheme у тебя define-syntax.
Который работает в точности как defmacro, да. Только называется по-другому.

(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.

в каком месте они работают так же?

Цитата
Берет. (define-synatx (yoba stx) ...), вот stx - аргумент.

Возьмём пример с http://docs.racket-lang.org:
(define-syntax foo (syntax-rules () ((_ a ...) (printf "~a\n" (list a ...)))))
где тут аргументы?

Цитата
Ну напиши мне хоть один макрос, который использует только defmacro.

(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

Moderators


Статус

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

#7065   2013-06-08 22:55 GMT+3 часа(ов)      
Цитата
Я не знаю, что такое макротрансформеры
ну, все... приехали
Цитата
http://axisofeval.blogspot.ru/2010/07/whats-phase-separation-and-when-do-you.html
Связана.
Слышу звон, да не знаю, где он Объясни своими словами.
Цитата
В Scheme у тебя define-syntax.
Он работает аналогично defmacro. См. http://www.lisp.ru/forums.php?m=posts&q=709
Цитата
Вот и я о том, что в Схемке сложная compile-time семантика.
Как и в CL.
Цитата
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)))))
И все-таки зачем превращать лисп в подобие дилана?
Цитата
Твоя "функция" даже аргументов не берёт.
У макроса может быть всего один аргумент - синтаксический объект. Что может быть проще?
Цитата
Для CL есть только defmacro
А Схемка захлебывается в...
Это дополнения из Рэкета, упрощающие написание "правильных" макросов. См. стандарт r6rs.

misha

Moderators


Статус

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

#7066   2013-06-08 23:08 GMT+3 часа(ов)      
Цитата
в каком месте они работают так же?
См. стандарт.
Цитата
(define-syntax foo (syntax-rules () ((_ a ...) (printf "~a\n" (list a ...)))))
где тут аргументы?
syntax-rules - макрос

snv

Members


Статус

25 сообщений
http://sym.at.ua/load
Где: Russia Серпухов
Род занятий: Безработный
Возраст: 31

#7067   2013-06-09 05:09 GMT+3 часа(ов)      
Цитата
misha :
ну, все... приехали

что же делать?

Цитата
Слышу звон, да не знаю, где он Объясни своими словами.

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.

В CL один defmacro


Цитата
И все-таки зачем превращать лисп в подобие дилана?

Причём тут дилан?

Цитата
У макроса может быть всего один аргумент - синтаксический объект. Что может быть проще?

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

Цитата
Это дополнения из Рэкета

В обычной Схеме нет syntax-object?

Цитата
syntax-rules - макрос

А 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

Moderators


Статус

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

#7068   2013-06-09 14:00 GMT+3 часа(ов)      
Цитата
что же делать?
Решай сам
Цитата
>bindings in phase level 1 constitute the transformer environment.

т.е. макросы (transformer environment) прямо связаны с фазами
Как и в CL, разница лишь в том, что в CL отсутствует четкое разделение по фазам. Т.е. в CL можно создавать собственные вложенные фазы (псевдофазы) с помощью eval-when. В CL "phase level 1" именуется как стадия "macro expansion".
Цитата
В CL один defmacro
defmacro - это удобный макрос, создающий макротрансформер и добавляющий его в environment.
Цитата
Причём тут дилан?
Просто твоя макросистема смахивает на дилановскую.
Цитата
В таком случае твой "макрос" - не обычная функция.
Как раз самая обычная, т.е. любую функцию принимающую один аргумент можно использовать как макрос. А в CL есть договоренность насчет параметров, короче, макрос может принимать дополнительные параметры в отличие от обычной функции. А почему так? Да просто синтаксический объект уже содержит все, что нам нужно! Т.е. нет нужды модифицировать local environment, как в случае с CL. (Ищи грязные макрохаки для CL)
Цитата
Настоящие Лисповские Макросы™ - это обычные функции, аргументы которым передаются как есть.
И в чем разница?
Цитата
В обычной Схеме нет syntax-object?
Там все гораздо примитивнее. Т.е. с синтаксическим объектом работать не так удобно, как в рэкете.
Цитата
А define-syntax тогда что?
Стандартная форма, тогда как defmacro является макросом.
Цитата
Откуда syntax-rules берёт исходный SEXP?
syntax-rules создает функцию, которая парсит синтаксический объект в соответствии с образцом.

snv

Members


Статус

25 сообщений
http://sym.at.ua/load
Где: Russia Серпухов
Род занятий: Безработный
Возраст: 31

#7069   2013-06-10 04:23 GMT+3 часа(ов)      
Цитата
misha :
Цитата
Решай сам

Как невежеда может что-то решать?

Цитата
Как и в CL, разница лишь в том, что в CL отсутствует четкое разделение по фазам. Т.е. в CL можно создавать собственные вложенные фазы (псевдофазы) с помощью eval-when. В CL "phase level 1" именуется как стадия "macro expansion".

В CL есть read-time, compile-time, load-time и run-time

Цитата
defmacro - это удобный макрос, создающий макротрансформер и добавляющий его в environment.

И зачем нужно что-то кроме него? Более того, даже defmacro можно убрать, оставив defun + флаг, указывающий, как ей выглядеть на момент compile-time.

Цитата
Просто твоя макросистема смахивает на дилановскую.

Чем именно?

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

Опять уход от семантики FEXPR.

Цитата
в CL есть договоренность насчет параметров, короче, макрос может принимать дополнительные параметры в отличие от обычной функции.

Использовать их считается плохим дизайном, ибо макрос не должен зависеть от контекста. Хороший пример тут RETURN-FROM, требующий явно указать откуда возвращаться, так как функции могут быть вложенными. В результат RETURN-FROM гибок и способен заменить сразу сишный return, continue и некоторые случаи goto. А вот сишные return и continue - примеры плохого дизайна.


Цитата
Там все гораздо примитивнее. Т.е. с синтаксическим объектом работать не так удобно, как в рэкете.

Т.е. вместо 100 syntax-ориентированных функции Racket, в чистой Scheme всего 90? Извиняюсь за сарказм.


Цитата
syntax-rules создает функцию, которая парсит синтаксический объект в соответствии с образцом.

Кажется начаю понимать. В Scheme страшная путаница с syntax-rules/syntax-case, да и define-syntax имеет несколько вариации. Вот к чему ведёт уход от defmacro. Кстати, почему нельзя парсить объект силами обычных match или list-case функций?
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

Members


Статус

300 сообщений

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

#7070   2013-06-10 10:40 GMT+3 часа(ов)      
Цитата
"This is another concept, like hygiene, that is only now (or just recently) becoming understood by the peoples."

и где тут про связь фаз с гигиеной?

Цитата
в каком месте они работают так же?

во всех
ты же сам спецификация прочитал. там для define-syntax и defmacro одно и то же написано только разными словами

Цитата
Возьмём пример с http://docs.racket-lang.org:
(define-syntax foo (syntax-rules () ((_ a ...) (printf "~a\n" (list a ...)))))
где тут аргументы?

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

Цитата
(defmacro один-макрос (a b) (list b a))

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

Kergan

Members


Статус

300 сообщений

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

#7071   2013-06-10 10:48 GMT+3 часа(ов)      
Цитата
т.е. макросы (transformer environment) прямо связаны с фазами

макросы связаны. а гигиена - нет

Цитата
В CL один defmacro

а в схеме один define-syntax

Цитата
В таком случае твой "макрос" - не обычная функция.

обычная функция

Цитата
Настоящие Лисповские Макросы™ - это обычные функции, аргументы которым передаются как есть.

ну так в схеме они именно так и передаются

Цитата
В обычной Схеме нет syntax-object?

стандарт не требует

Цитата
А define-syntax тогда что?

тоже макрос, как дефмакро

Цитата
Откуда syntax-rules берёт исходный SEXP?

ниоткуда не берет. ему и не надо

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

не обязательно функцию, кстати. можно де и просто сделать (define-syntax yoba 1)

Kergan

Members


Статус

300 сообщений

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

#7072   2013-06-10 10:58 GMT+3 часа(ов)      
Цитата
И зачем нужно что-то кроме него?

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

Цитата
Более того, даже defmacro можно убрать, оставив defun + флаг, указывающий, как ей выглядеть на момент compile-time.

так вот define-syntax это и есть такой флаг. (define-syntax yoba body) значит "присвоить yoba значение формы body и трактовать идентификатор yoba как макрос" а body уже может быть чем угодно - например функцией, которая принимает синтаксический объект и возвращает синтаксический объект (макрос).

Цитата
Чем именно?


всем

Цитата
Опять уход от семантики FEXPR.

так от нее уже давно все ушли. плохая семантика же. неудобная, негибкая.

Цитата
Т.е. вместо 100 syntax-ориентированных функции Racket, в чистой Scheme всего 90?

на самом деле их всего две: datum->syntax и syntax-e. для разбора и построения снитаксических объектов никаких ф-й больше не надо.

Цитата
Кажется начаю понимать. В Scheme страшная путаница с syntax-rules/syntax-case,

нету никакой путаницы

Цитата
Кстати, почему нельзя парсить объект силами обычных match или list-case функций?

почему нельзя? можно.

snv

Members


Статус

25 сообщений
http://sym.at.ua/load
Где: Russia Серпухов
Род занятий: Безработный
Возраст: 31

#7075   2013-06-10 23:53 GMT+3 часа(ов)      
Цитата
Kergan :
ты тут еще какой-то list используешь. это слишком сложно

Где это ты видел Lisp без списков?

Цитата
почему нельзя? можно.

Тогда зачем syntax-case?

Цитата
всем

define "все"

Цитата
так вот define-syntax это и есть такой флаг. (define-syntax yoba body) значит "присвоить yoba значение формы body и трактовать идентификатор yoba как макрос" а body уже может быть чем угодно - например функцией, которая принимает синтаксический объект и возвращает синтаксический объект (макрос).

И как получить значение этого 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


Онлайн :

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




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