> 1 <

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

misha

Moderators


Статус

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

#4537   2011-07-05 15:12 GMT+3 часа(ов)      
Аналог DEFMACRO(ориентированный на модули) можно довольно просто реализовать
(define-syntax (defmacro so)
(syntax-case so ()
[(_ id formals sexp . body)
#'(define-syntax id
(let ([macros (lambda formals sexp . body)])
(lambda (stx)
(datum->syntax stx (apply macros (cdr (syntax->list stx)))))))]))

В отличие от классического DEFMACRO, этот аналог в качестве параметров принимает синтаксические объекты.

Примеры использования
(defmacro 1+ (a)
#`(add1 #,a))
 
(defmacro swap (a b)
#`(let ([temp #,a])
(set! #,a #,b)
(set! #,b temp)))
 
(defmacro unhygienic-swap (a b)
`(let ([temp ,a])
(set! ,a ,b)
(set! ,b temp)))
 
> (let ([add1 sub1])
(1+ 0))
1
> (let ([set! void]
[a 'a]
[b 'b]
[c 'c]
[d 'd])
(swap a b)
(unhygienic-swap c d)
(printf "a = ~a, b = ~a\n" a b)
(printf "c = ~a, d = ~a\n" c d))
a = b, b = a
c = c, d = d
 

Kergan

Members


Статус

300 сообщений

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

#4539   2011-07-05 18:18 GMT+3 часа(ов)      
А какой смысл в таком макросе? Чисто для тех, кто привык к defmacro по CL?
И еще:
(datum->syntax stx (apply macros (cdr (syntax->list stx))))
Вот это неправильно
Надо вот так:
(datum->syntax #'here (apply macros (cdr (syntax->list stx))))
а то вдруг вам кто-нибудь #%app переопределит ;)

misha

Moderators


Статус

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

#4541   2011-07-06 14:50 GMT+3 часа(ов)      
Цитата
А какой смысл в таком макросе? Чисто для тех, кто привык к defmacro по CL?

Пускай это будет для них легким стартом. В нете много мифов про гигиенические макросы.
Цитата
(datum->syntax #'here (apply macros (cdr (syntax->list stx))))
а то вдруг вам кто-нибудь #%app переопределит ;)

rv82

Members


Статус

46 сообщений
http://rv82.ya.ru
Где: Russia
Род занятий:
Возраст:

#5883   2012-03-14 18:58 GMT+3 часа(ов)      
misha
В нете много мифов про гигиенические макросы.

А можно ссылочку Интересно ознакомиться со всеми точками зрения.

misha

Moderators


Статус

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

#5895   2012-03-15 03:33 GMT+3 часа(ов)      
К сожалению, я не составлял коллекции ссылок. В большинстве случаев их породило невежество вызванное ленью некоторых товарищей.

отредактировал(а) misha: 2012-03-15 03:46 GMT+3 часа(ов)
> 1 <


Онлайн :

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




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