Hello, This is version 6.5.0.5.
(define-syntax (define-tokens stx) (syntax-case stx [] [(_ token #:+ Token (extra ...) #:with [[subtoken #:+ SubToken subrest ...] ...] [id #:+ ID #:-> parent #:as Type rest ...] ...) (with-syntax ([token->datum (format-id #'token "~a->datum" (syntax-e #'token))] [([id? id-datum] ...) (for/list ([<id> (in-list (syntax->list #'(id ...)))]) (list (format-id <id> "~a?" (syntax-e <id>)) (format-id <id> "~a-datum" (syntax-e <id>))))]) #'(begin (struct: token : Token ([source : Any] [line : Natural] [column : Natural] [position : Natural] [span : Natural] extra ...)) (struct: subtoken : SubToken subrest ...) ... (define-token id #:+ ID #:-> parent #:as Type rest ...) ... (define token->datum : (-> Token Datum) (lambda [instance] (cond [(id? instance) (id-datum instance)] ... [else (assert (object-name instance) symbol?)])))))])) The following code is okay, however, if more definitions are added, then the typechecking will refuse to terminate itself. (define-tokens css-token #:+ CSS-Token () #:with [[css:numeric #:+ CSS:Numeric css-token ([representation : String])] [css:number #:+ CSS:Number css:numeric ()]] [css:bad #:+ CSS:Bad #:-> css-token #:as Datum] [css:close #:+ CSS:Close #:-> css-token #:as Char] [css:cd #:+ CSS:CD #:-> css-token #:as Symbol] [css:match #:+ CSS:Match #:-> css-token #:as Char] [css:ident #:+ CSS:Ident #:-> css-token #:as Symbol] [css:url #:+ CSS:URL #:-> css-token #:as String] [css:function #:+ CSS:Function #:-> css-token #:as Symbol]) The attachment contains the full example to run. Thanks. -- 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.
infinite-typechecking.rkt
Description: Binary data