hide-comments-typed.rkt (4984B)
1 #lang typed/racket 2 3 (require (rename-in syntax/parse [...+ …+]) 4 syntax/stx 5 racket/match 6 racket/set 7 racket/list 8 racket/function 9 racket/vector 10 racket/contract 11 sexp-diff 12 racket/pretty 13 rackunit 14 (only-in racket/base [... …]) 15 (for-syntax (rename-in racket/base [... …])) 16 tr-immutable/typed-syntax 17 "syntax-properties-typed.rkt") 18 19 (provide hide-#%comment) 20 21 ;; ([#%comment c1] a [#%comment c2] . ([#%comment c3] b [#%comment c4])) 22 ;; => (aᶜ² . (bᶜ⁴)⁻ᶜ³)⁻ᶜ¹ 23 ;; (c1 a c2 . (c3 . (c4 b c5))) 24 ;; => (aᶜ² . (bᶜ⁵)⁻ᶜ³⁻⁻ᶜ⁴)⁻ᶜ¹ 25 ;; (c1 a c2 . (c3 . (c4 c5))) 26 ;; => (aᶜ² . ()⁻ᶜ³⁻⁻ᶜ⁴ᶜ⁵)⁻ᶜ¹ 27 ;; (c1 a (c2) b) 28 ;; => (a ()⁻ᶜ² b)⁻ᶜ¹ 29 ;; (c1 a (c2 . b) c) 30 ;; => (a b⁻ᶜ² c)⁻ᶜ¹ 31 ;; (c1 a (c2 . (c3 c4)) c) 32 ;; => (a ()⁻ᶜ²⁻⁻ᶜ³ᶜ⁴ c)⁻ᶜ¹ 33 (: hide-#%comment (→ ISyntax/Non-Stx ISyntax/Non-Stx)) 34 (define (hide-#%comment stx) 35 (cond 36 [(pair? (syntax-e stx)) 37 (hide-in-pair (syntax-e stx))] 38 [else 39 ;; TODO: recurse down vectors etc. 40 stx])) 41 42 (define-type ISyntax/Non-List* 43 (Rec L (U ISyntax/Non 44 Null 45 (Pairof ISyntax/Non L)))) 46 47 (define pair (ann cons (∀ (A B) (→ A B (Pairof A B))))) 48 49 (: hide-in-pair (→ ISyntax/Non-List* 50 ISyntax/Non-Stx)) 51 (define (hide-in-pair e*) 52 (let loop ([rest : ISyntax/Non-List* e*] 53 [groups : (Pairof (Listof Comment) 54 (Listof (Pairof ISyntax/Non (Listof Comment)))) 55 '(())]) 56 (if (pair? rest) 57 (if (comment? (car rest)) 58 (loop (cdr rest) 59 (pair (pair (ann (car rest) Comment) (car groups)) 60 (cdr groups))) 61 (loop (cdr rest) 62 (pair (ann '() (Listof Comment)) 63 (pair (pair (car rest) (reverse (car groups))) 64 (cdr groups))))) 65 (values rest groups))) 66 (error "TODOrtfdsvc")) 67 68 (define-type Comment (Syntaxof (Pairof (Syntaxof '#%comment) Any))) 69 (define comment? (make-predicate Comment)) 70 71 72 #;(if ((make-predicate (Rec R (Pairof (Syntaxof (Pairof (Syntaxof '#%comment) Any)) 73 (U Boolean 74 Char 75 Number 76 Keyword 77 Null 78 String 79 Symbol 80 BoxTop 81 VectorTop 82 R)))) 83 e*) 84 (error "TODOwa" e*) 85 (error "TODOwa" e*)) 86 87 #| 88 (: listof? (∀ (A) (→ Any (→ Any Boolean : A) Boolean : (Listof A)))) 89 (define (listof? l p?) 90 (pair? l 91 p? 92 (ann (λ (a) 93 (list*? a p?)) 94 (→ Any Boolean : )) 95 |# 96 97 #;(match (syntax-e stx) 98 [(not (? pair?)) 99 ;; TODO: recurse down vectors etc. 100 stx] 101 [(list* e* ... rest) 102 (error "TODO") 103 #;(syntax-parse e* 104 #:datum-literals (#%comment) 105 [({~and c₀ [#%comment . _]} … 106 {~seq {~and eᵢ {~not [#%comment . _]}} 107 {~and cᵢⱼ [#%comment . _]} …} 108 …+) 109 (define new-e* (map with-comments-after 110 (map hide-#%comment 111 (syntax->list #'(eᵢ …))) 112 (map syntax->list 113 (syntax->list #'((cᵢⱼ …) …))))) 114 (define new-rest (if (null? rest) 115 rest 116 (hide-#%comment rest))) 117 (with-first-comments 118 (datum->syntax stx (append new-e* new-rest) stx stx) 119 (cons #f (syntax->list #'(c₀ …))))] 120 [({~and c₀ [#%comment . _]} …) 121 (define new-rest (if (null? rest) 122 rest 123 (hide-#%comment rest))) 124 (with-first-comments 125 (with-comments-after 126 (datum->syntax stx new-rest stx stx) 127 (if (syntax? new-rest) 128 (syntax-property new-rest 'comments-after) 129 '())) 130 (cons (if (syntax? new-rest) 131 (cons (datum->syntax new-rest 132 'saved-props+srcloc 133 new-rest 134 new-rest) 135 (or (syntax-property new-rest 'first-comments) 136 ;; TODO: I'm dubious about this, better typecheck 137 ;; everything… 138 (cons #f null))) 139 #f) 140 (syntax->list #'(c₀ …))))])])