Is this anything like what you wanted?

(require web-server/dispatch
         (for-syntax syntax/parse
                     racket/list))

(begin-for-syntax
  ;; mdr-clause->dr-clauses : Syntax -> (Listof Syntax)
  (define (mdr-clause->dr-clauses mdr-clause)
    (syntax-parse mdr-clause
      [[(thing ...) #:dispatch-rules sub-dr-clause ...]
       (for/list ([sub-dr-clause-stx (in-list (syntax->list #'(sub-dr-clause 
...)))])
         (syntax-parse sub-dr-clause-stx
           [[(sub-thing ...) dispatch-fun]
            #'[(thing ... sub-thing ...) dispatch-fun]]
           [[(sub-thing ...) #:method method dispatch-fun]
            #'[(thing ... sub-thing ...) #:method method dispatch-fun]]))]
      [[(thing ...) #:my-dispatch-rules sub-mdr-clause ...]
       (with-syntax ([(sub-dr-clause ...) (append*
                                           (for/list ([sub-mdr-clause (in-list 
(syntax->list #'(sub-mdr-clause ...)))])
                                             (mdr-clause->dr-clauses 
sub-mdr-clause)))])
         (mdr-clause->dr-clauses #'[(thing ...) #:dispatch-rules sub-dr-clause 
...]))]
      [_ (list mdr-clause)]
      ))
  )

(define-syntax (my-dispatch-rules stx)
  (syntax-parse stx
    [(my-dispatch-rules mdr-clause ...)
     (with-syntax ([(dr-clause ...) (append*
                                     (for/list ([mdr-clause (in-list 
(syntax->list #'(mdr-clause ...)))])
                                       (mdr-clause->dr-clauses mdr-clause)))])
       #'(dispatch-rules
          dr-clause ...))]))
      

(syntax->datum
 (expand-syntax-once
  #'(my-dispatch-rules
     [("page-a") #:my-dispatch-rules 
                 [("handler-a" (integer-arg)) handler-a]
                 [("handler-b" (integer-arg)) handler-b]]
     [("page-b") #:my-dispatch-rules 
                 [("handler-c" (integer-arg)) handler-c]
                 [("handler-d" (integer-arg)) handler-d]])))
; =>
;'(dispatch-rules
;  (("page-a" "handler-a" (integer-arg)) handler-a)
;  (("page-a" "handler-b" (integer-arg)) handler-b)
;  (("page-b" "handler-c" (integer-arg)) handler-c)
;  (("page-b" "handler-d" (integer-arg)) handler-d))

On Jun 27, 2014, at 3:47 PM, Jack Firth <[email protected]> wrote:

> I'm working with some servlet dispatching code and I want to be able to use 
> dispatch-rules to generate the url to response mappings, but I want to be 
> able to group related handlers to subpages. Under dispatch-rules, that looks 
> something like this:
> 
> (dispatch-rules
>     [("page-a" "handler-a" (integer-arg)) handler-a]
>     [("page-a" "handler-b" (integer-arg)) handler-b]
>     [("page-b" "handler-c" (integer-arg)) handler-c]
>     [("page-b" "handler-d" (integer-arg)) handler-d])
> 
> What I want is to be able to specify a tree structure of some sort like this:
> 
> (my-dispatch-rules
>     [(my-dispatch-rules "page-a"
>         [("handler-a" (integer-arg)) handler-a)]
>         [("handler-b" (integer-arg)) handler-b)]
>     [(my-dispatch-rules "page-b"
>         [("handler-c" (integer-arg)) handler-c)]
>         [("handler-d" (integer-arg)) handler-d)])
> 
> And have that expand, placing the page-a and page-b bits in the appropriate 
> areas. From what I understand of macros, the appropriate way to do this is 
> with quasiquoting and splicing unquotes, but I can't seem to figure out using 
> splicing with syntax-case, and the various tutorials and documentation I've 
> looked at haven't helped me really wrap my head around the specifics. If 
> someone could point me towards enlightenment, that would be much appreciated.
> ____________________
>  Racket Users list:
>  http://lists.racket-lang.org/users

____________________
  Racket Users list:
  http://lists.racket-lang.org/users

Reply via email to