On 11/14/2010 07:52 PM, Sam Tobin-Hochstadt wrote: > On Sat, Nov 13, 2010 at 5:09 PM, D Marshall <dmarshall...@gmail.com> wrote: >> I understand that DATUM->SYNTAX gets it's context >> information from it's first argument. I have no problems >> when using simple (non-ellipses) pattern variables, however, >> I haven't been unable to get a strictly "ellipses pattern" >> to work in this context (no pun intended). > Here are two options: > > This is my preference - use the context of the macro application > (define-syntax test-this > (lambda (x) > (syntax-case x () > [(_ a ...) > (with-syntax > ([form (datum->syntax x > `(+ ,@(syntax->datum (syntax (a ...)))))]) > (syntax form))]))) > > This is also common, but can break in some cases: > (define-syntax test-this > (lambda (x) > (syntax-case x () > [(kw a ...) > (with-syntax > ([form (datum->syntax (syntax kw) > `(+ ,@(syntax->datum (syntax (a ...)))))]) > (syntax form))]))) > > The reason what you tried to do didn't work is that you need a context > that is from the context of the macro use. The rest of the list isn't > something the programmer originally wrote, but something that was > generated by your macro, so it doesn't have any useful context. This works too:
(define-syntax test-this (lambda (x) (syntax-case x () [(_ a ...) (with-syntax ([form (datum->syntax (car (syntax->list #'(a ...))) `(+ ,@(syntax->datum #'(a ...))))]) (syntax form))]))) (let*-values ([(one two three) (values 10 20 30)]) (test-this one two three)) > 60 I thought the reason that using #'(a ...) as the context didn't work was because #'(a ...) creates a new syntax object by expanding `a' with the ellipses and so you get the wrong context. But that new syntax object is composed of objects from the original usage which is why taking the car works. _________________________________________________ For list-related administrative tasks: http://lists.racket-lang.org/listinfo/users