main.rkt (1287B)
1 #lang racket/base 2 3 (require (for-syntax racket/base 4 racket/syntax) 5 (except-in scribble/lp2 chunk CHUNK)) 6 7 (require (only-in hyper-literate/private/lp 8 chunk 9 CHUNK)) 10 11 (provide defck 12 repeat-chunk 13 chunk 14 CHUNK) 15 16 (define-syntax (defck stx) 17 (syntax-case stx () 18 [(self . rest) 19 (with-syntax ([(name . content) #'rest] 20 [chk (datum->syntax #'self 'chunk)]) 21 (with-syntax ([name2 (format-id #'name "~a-repeat" #'name)]) 22 #`(begin 23 #,(syntax/loc stx (chk . rest)) 24 ;(define name2 #'content) 25 (define-syntax (name2 stx2) 26 (syntax-case stx2 () 27 [(_ prefix (... ...)) #'(prefix (... ...) . content)])))))])) 28 29 (define-syntax (repeat-chunk stx) 30 (syntax-case stx () 31 [(self name) 32 (let ([stripped-name (regexp-replace #px"^<(.*)>$" 33 (symbol->string (syntax-e #'name)) 34 "\\1")]) 35 (with-syntax ([chk (datum->syntax #'self 'chunk)] 36 [name2 (format-id #'name "~a-repeat" #'name)] 37 [name-rep (format-id #'name "(~a)" stripped-name)]) 38 #'(name2 chk name-rep)))]))