(use awful html-tags srfi-13) (define-syntax define-app (syntax-rules (matcher: handler-hook: parameters:) ((_ id matcher: matcher handler-hook: proc body ...) (let ((proc* proc) (matcher* matcher)) (add-request-handler-hook! 'id (lambda (path handler) (when (matcher* path) (proc* handler)))) (proc* (lambda () body ...)))) ((_ id matcher: matcher parameters: params body ...) (let ((matcher* matcher)) (add-request-handler-hook! 'id (lambda (path handler) (when (matcher* path) (parameterize params (handler))))) (parameterize params body ...))) ((_ id matcher: matcher body ...) (let ((matcher* matcher)) (add-request-handler-hook! 'id (lambda (path handler) (when (matcher* path) (handler)))) body ...)))) ;;; ;;; App foo ;;; (define-app foo matcher: (lambda (path) (string-prefix? "/foo" path)) parameters: ((enable-ajax #t) (enable-sxml #t) (ajax-library "/the-foo-ajax.js")) (define-page "/foo/baz" (lambda () '(p "baz from foo"))) (define-page "/foo/quux" (lambda () '(p "quux from foo"))) ) ;;; ;;; App bar ;;; (define-app bar matcher: (lambda (path) (string-prefix? "/bar" path)) handler-hook: (lambda (handler) (parameterize ((enable-ajax #t) (ajax-library "/js/bar.js")) (handler))) (define-page "/bar/baz" (lambda () (

"baz from bar"))) (define-page "/bar/quux" (lambda () (

"quux from bar"))) ) ;;; ;;; App baz ;;; (define-app baz matcher: (lambda (path) (string-prefix? "/baz" path)) (define-page "/baz/foo" (lambda () "foo from baz")) (define-page "/baz/bar" (lambda () "bar from baz")) )