Hi Alexander D. Knauth Thanks, for your very clear answers. (require (rename-in racket (+ plus))) works too. A silly mistake of mine to think define would do the same. It does not, of course. Your argument that a literal-id may occur more than once in a pattern makes sense. I'll play with syntax-parse and (_ (~and + (~literal +)) (~literal +)). May be I am able to make a syntax transformer, say my-syntax-case, available in expansion-phase, that does what you have suggested. Thanks again, Jos Koot
_____ From: [email protected] [mailto:[email protected]] On Behalf Of Alexander D. Knauth Sent: sábado, 04 de abril de 2015 19:35 To: Jos Koot Cc: [email protected] Subject: Re: [racket-users] Questions: free-identifier=?; literal-id in syntax-case On Apr 4, 2015, at 11:22 AM, Jos Koot <[email protected]> wrote: The following puzzles me: #lang racket (define plus +) (free-identifier=? #'+ #'plus) ; -> #f #lang racket (define-syntax (a stx) (syntax-case stx () ((_) (datum->syntax stx (free-identifier=? #'+ #'plus))))) (define plus +) (a) ; -> #f #lang racket (define plus +) (define-syntax (a stx) (syntax-case stx (+) ((_ +) #'#t) ((_ x) #'#f))) (a plus) ; -> #f I am confused, because I expect #t to be produced in the three above cases. Obviously I don't understand free-identifier=? well. Can you help me with that? Maybe you’re thinking of what happens when you use (define-syntax plus (make-rename-transformer #’+)) Instead of (define plus +) As another question: the docs on syntax-case state: "An id that has the same binding as a literal-id matches a syntax object that is an identifier with the same binding in the sense of free-identifier=? <file:///C:/Program%20Files/Racket/doc/reference/stxcmp.html?q=syntax-case#% 28def._%28%28quote._~23~25kernel%29._free-identifier~3d~3f%29%29> . The match does not introduce any <file:///C:/Program%20Files/Racket/doc/reference/stx-patterns.html?q=syntax- case#%28tech._pattern._variable%29> pattern variables." Why isn't or cant't the match introduce a pattern variable? Without binding the literal-id as a pattern variable, location information is lost, for example: #lang racket (error-print-source-location #t) (begin-for-syntax (error-print-source-location #t)) (define-syntax (a stx) (syntax-case stx (+) ((_ +) (raise-syntax-error 'a "msg" stx #'+)))) ; <--- (a +) raises a syntax-error as expected, but it highlights + in the line marked <---, not in the last line. I would prefer the + in the last line to be highlighted. I mostly agree with that idea, but there is a reason why it doesn’t do that. If it did that, then I don’t think you could do things like put multiple of these in a single pattern, so for instance: (define-syntax (a stx) (syntax-case stx (+) [(_ + +) (raise-syntax-error ‘a “msg” stx #’+)])) (a +) It wouldn’t know which + to bind. The way I do this which feels a bit clunky like there should be a better solution: (define-syntax (a stx) (syntax-parse stx [(_ (~and + (~literal +)) (~literal +)) (raise-syntax-error ‘a “msg” stx #’+)])) To tell it specifically to bind it. To make it a little less verbose, you could define a pattern-expander that expanded to (~and + (~literal +)), but I’m not sure how to do better than that. -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.

