Opaque syntax objects
Michael Sperber
(12 Aug 2005 15:18 UTC)
|
Re: Opaque syntax objects
felix winkelmann
(12 Aug 2005 20:22 UTC)
|
Re: Opaque syntax objects
Jens Axel Søgaard
(12 Aug 2005 23:20 UTC)
|
Re: Opaque syntax objects
Andre van Tonder
(13 Aug 2005 00:25 UTC)
|
Re: Opaque syntax objects
Michael Sperber
(13 Aug 2005 07:46 UTC)
|
Re: Opaque syntax objects
Jens Axel Søgaard
(14 Aug 2005 19:45 UTC)
|
Re: Opaque syntax objects
Andre van Tonder
(14 Aug 2005 20:22 UTC)
|
Re: Opaque syntax objects
bear
(14 Aug 2005 17:48 UTC)
|
Re: Opaque syntax objects
Keith Wright
(13 Aug 2005 07:31 UTC)
|
Re: Opaque syntax objects
Michael Sperber
(13 Aug 2005 12:33 UTC)
|
Re: Opaque syntax objects Jens Axel Søgaard (14 Aug 2005 20:27 UTC)
|
Keith Wright wrote: >>As an example of a macro written using normal Scheme operators and >>these syntactical abbreviations, I have taken the macro do-primes >>from "Practical Common Lisp" p. 94. > > I do not see the point of this example. > I just ran the following through the SRFI reference implementation, > it works fine. That's (part of) the point. Felix asked: But wouldn't this completely break the (IMHO) rather practical ability to destructure arguments passed to macros via normal Scheme operators? What I like about srfi-72 is that I can write hygienic macros with (nearly) the same ease as in conventional Lisp-/quasiquote-style. In fact this is what I consider the most innovative feature for SRFI-72. So the do-primes example shows that the abstract approach too allows for i) destructuring with normal Scheme operations and ii) that macros can be written in the traditional quasiquote-style. > The template > happens to be a loop, but so what? > A more interesting example would do the loop in the macro expander. > I don't have time right now to work up a prime example, but here > is one I have laying about: > > (define-syntax define-count > (lambda (form) > #`,(let loop ((names (cdr form)) > (k 0) > (result '())) > (if (null? names) > (quasisyntax (begin ,@result)) > (loop (cdr names) > (+ k 1) > (cons #`(define ,(car names) ,k)) > result))))) Adding one syntax->list and replacing , and ,@ with #, and #,@ one gets: (define-syntax define-count (lambda (form) #`#,(let loop ((names (cdr (syntax->list form))) (k 0) (result '())) (if (null? names) (quasisyntax (begin #,@result)) (loop (cdr names) (+ k 1) (cons #`(define #,(car names) #,k) result)))))) which runs in DrScheme. For fun, here is a syntax-case version: (require-for-syntax (lib "list.ss" "srfi" "1")) (define-syntax (define-count stx) (syntax-case stx () [(define-count name ...) (with-syntax ([(count ...) (iota (length (syntax->list #'(name ...))))]) #'(begin (define name count) ...))])) >>A macro whose expansion uses quasiquote to construct a list can >>be hard to read (and write), if ordinary lists are used to represent >>syntax. It is not immediately obvious whether a given quasiquote >>is used to construct the expansion or is a part of the expansion >>of a call to the macro. > > Indeed, nested quasiquote is notoriously mind-bending. > What part of the SRFI should be changed to fix that? > How does a lot of syntax->list help? It isn't syntax->list that help. Spotting #' or #` signals that here a piece of code is constructed. Spotting ' or ` signals that a list will be constructed, when the expanded code is run. -- Jens Axel Søgaard