On Fri, 22 Apr 2011, Alex Shinn wrote:
On Fri, Apr 22, 2011 at 7:46 AM, Andre van Tonder <andre@x> wrote:Yes, it must be the same binding. Otherwise nested QUASIQUOTE will break.If we don't explicitly require that they are the same binding, and an implementation chooses to _not_ make them the same binding, then it must come up with some way to make quasiquote work. It can choose to use the Chibi/Chicken approach, or it can use a macro implementation which can match the nested quasiquote with the actual identifier the form was expanded from, or it can make quasiquote match itself unhygienically.
No, but that QUASIQUOTE macro /itself/ must work portably across modules, otherwise a lot of people are going to be unhappy. It is a plain syntax-rules macro that was portable Scheme before for many years since R5RS.It does not use anything questionable or strange or implementation-specific.
It also stands for a large number of other macros in the Scheme
corpus using similar techniques. I don't think it will be
acceptable to tell people that macros like
this won't be portable any longer and may need one
of the hacks that you are suggesting.
(define-syntax quasiquote
(syntax-rules (unquote unquote-splicing quasiquote)
((_ (unquote form))
form)
((_ ((unquote-splicing form) . rest))
(append form (quasiquote rest)))
((_ (quasiquote form) . depth)
(list 'quasiquote (quasiquote form #f . depth)))
((_ (unquote form) x . depth)
(list 'unquote (quasiquote form . depth)))
((_ (unquote-splicing form) x . depth)
(list 'unquote-splicing (quasiquote form . depth)))
((_ (car . cdr) . depth)
(cons (quasiquote car . depth) (quasiquote cdr . depth)))
((_ #(elt ...) . depth)
(list->vector (quasiquote (elt ...) . depth)))
((_ atom . depth)
'atom)))
_______________________________________________ Scheme-reports mailing list Scheme-reports@x http://lists.scheme-reports.org/cgi-bin/mailman/listinfo/scheme-reports