I'm trying to build a macro that will generate routing rules for
'dispatch-rules'.

(dispatch-rules) from web-server/dispatch has this form:

(dispatch-rules
   (("announce-user") #:method post process-announce-user))
   ...more routes here...
)

This seems like it should be automatable, so I tried to write a macro
to generate these rules.  I'd like
    (routing announce-user)
to expand to the line above:    (("announce-user") #:method post
process-announce-user))

Here's my stab at it, which is currently failing:


;;    This part works if I use it directly, ie:
;;  [("announce-file") #:method post (make-route msg-announce-file
announce-file*)]
;;
(define (make-route msg-handler pbuf-type)
  (lambda (req)
    (msg-handler (req->protobuf req pbuf-type))))


;;    Let's try to generate the entire rule using the above
(define-syntax (routing stx)
  (syntax-case
      stx ()
    ([_ pbuf-type]
     (with-syntax* ([type-name    (format-id stx "~a*" #'pbuf-type)]
                    [handler-name (format-id stx "msg-~a" #'type-name)]
                    [route-name   (symbol->string (syntax->datum
(format-id stx "~a" (syntax->datum #'pbuf-type))))]
                    )
                   #'[(route-name) #:method "post" (make-route
handler-name type-name)]
;;                   #'(quote [(route-name) #:method "post"
(make-route handler-name type-name)])
                   ))))

;;(routing announce-file)  ; If I use this (i.e. outside the
dispatch-rules) in combination with the 'quote' version above, I see
the correct thing

(define-values (dispatch-request url-for)
  (dispatch-rules
   (routing announce-file)
   [("create-user") #:method post process-create-user]
   ...more routes here...
)

Error is:

racket network/routing.rkt
~/app/network/routing.rkt:194.2: dispatch-rules: bad syntax
  in: (dispatch-rules (routing announce-file) (("create-user")
#:method post process-create-user) ...
  context...:
   
/Applications/Racket_v6.6/collects/syntax/parse/private/runtime-report.rkt:698:0:
error/report
   
/Applications/Racket_v6.6/collects/syntax/parse/private/runtime-report.rkt:28:0:
call-current-failure-handler
   standard-module-name-resolver


As mentioned in the comments, it does generate (the quoted form of)
the correct thing if I:

1) inside the macro, comment in the 'quote' line and comment out the
line above it
2) comment OUT the '(routing announce-file) that is inside dispatch-rules
3) comment IN the (routing announce-user) line that is just above dispatch-rules


My suspicion is that dispatch-rules is a macro and so my macro is not
being expanded inside another macro.  That's not how I thought macros
worked, though, so now I'm really puzzled.

Can anyone clarify this for me?

-- 
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 racket-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to