if polyglot#init#is_disabled(expand('<sfile>:p'), 'racket', 'syntax/racket.vim')
  finish
endif

" Vim syntax file
" Language:     Racket
" Maintainer:   Will Langstroth <will@langstroth.com>
" URL:          http://github.com/wlangstroth/vim-racket.git
" Description:  Contains all of the keywords in #lang racket

" Initializing:
if version < 600
  syntax clear
elseif exists("b:current_syntax")
  finish
endif

syn case ignore

" Highlight unmatched parens
syn match racketError ,[]})],

if version < 600
  set iskeyword=33,35-39,42-58,60-90,94,95,97-122,126,_
else
  setlocal iskeyword=33,35-39,42-58,60-90,94,95,97-122,126,_
endif

" Forms in order of appearance at
" http://docs.racket-lang.org/reference/index.html
"
syn keyword racketSyntax module module* module+ require provide quote
syn keyword racketSyntax #%datum #%expression #%top #%variable-reference #%app
syn keyword racketSyntax lambda case-lambda let let* letrec
syn keyword racketSyntax let-values let*-values let-syntax letrec-syntax
syn keyword racketSyntax let-syntaxes letrec-syntaxes letrec-syntaxes+values
syn keyword racketSyntax local shared
syn keyword racketSyntax if cond and or case define else =>
syn keyword racketSyntax define define-values define-syntax define-syntaxes
syn keyword racketSyntax define-for-syntax define-require-syntax define-provide-syntax
syn keyword racketSyntax define-syntax-rule
syn keyword racketSyntax define-record-type
syn keyword racketSyntax begin begin0
syn keyword racketSyntax begin-for-syntax
syn keyword racketSyntax when unless
syn keyword racketSyntax set! set!-values
syn keyword racketSyntax for for/list for/vector for/hash for/hasheq for/hasheqv
syn keyword racketSyntax for/and for/or for/lists for/first
syn keyword racketSyntax for/last for/fold
syn keyword racketSyntax for* for*/list for*/vector for*/hash for*/hasheq for*/hasheqv
syn keyword racketSyntax for*/and for*/or for*/lists for*/first
syn keyword racketSyntax for*/last for*/fold
syn keyword racketSyntax for/fold/derived for*/fold/derived
syn keyword racketSyntax define-sequence-syntax :do-in do
syn keyword racketSyntax with-continuation-mark
syn keyword racketSyntax quasiquote unquote unquote-splicing quote-syntax
syn keyword racketSyntax #%top-interaction
syn keyword racketSyntax define-package open-package package-begin
syn keyword racketSyntax define* define*-values define*-syntax define*-syntaxes open*-package
syn keyword racketSyntax package? package-exported-identifiers package-original-identifiers
syn keyword racketSyntax block #%stratified-body

" 8 Contracts
" 8.2 Function contracts
syn keyword racketSyntax -> ->* ->i ->d case-> dynamic->* unconstrained-domain->

" 8.6.1 Nested Contract Boundaries
syn keyword racketSyntax with-contract define/contract define-struct/contract
syn keyword racketSyntax invariant-assertion current-contract-region

" 9 Pattern Matching
syn keyword racketSyntax match match* match/values define/match
syn keyword racketSyntax match-lambda match-lambda* match-lambda**
syn keyword racketSyntax match-let match-let* match-let-values match-let*-values
syn keyword racketSyntax match-letrec match-define match-define-values

" 10.2.3 Handling Exceptions
syn keyword racketSyntax with-handlers with-handlers*

" 10.4 Continuations
syn keyword racketSyntax let/cc let/ec

" 10.4.1 Additional Control Operators
syn keyword racketSyntax % prompt control prompt-at control-at reset shift
syn keyword racketSyntax reset-at shift-at prompt0 reset0 control0 shift0
syn keyword racketSyntax prompt0-at reset0-at control0-at shift0-at
syn keyword racketSyntax set cupto

" 11.3.2 Parameters
syn keyword racketSyntax parameterize parameterize*

" 12.5 Writing
syn keyword racketSyntax write display displayln print
syn keyword racketSyntax fprintf printf eprintf format
syn keyword racketSyntax print-pair-curly-braces print-mpair-curly-braces print-unreadable
syn keyword racketSyntax print-graph print-struct print-box print-vector-length print-hash-table
syn keyword racketSyntax print-boolean-long-form print-reader-abbreviations print-as-expression print-syntax-width
syn keyword racketSyntax current-write-relative-directory port-write-handler port-display-handler
syn keyword racketSyntax port-print-handler global-port-print-handler

" 13.7 Custodians
syn keyword racketSyntax custodian? custodian-memory-accounting-available? custodian-box?
syn keyword racketSyntax make-custodian custodian-shutdown-all current-custodian custodian-managed-list
syn keyword racketSyntax custodian-require-memory custodian-limit-memory
syn keyword racketSyntax make-custodian-box custodian-box-value

" lambda sign
syn match racketSyntax /\<[\u03bb]\>/


" Functions ==================================================================

syn keyword racketFunc boolean? not equal? eqv? eq? equal?/recur immutable?
syn keyword racketFunc true false symbol=? boolean=? false?
syn keyword racketFunc number? complex? real? rational? integer?
syn keyword racketFunc exact-integer? exact-nonnegative-integer?
syn keyword racketFunc exact-positive-integer? inexact-real?
syn keyword racketFunc fixnum? flonum? zero? positive? negative?
syn keyword racketFunc even? odd? exact? inexact?
syn keyword racketFunc inexact->exact exact->inexact

" 3.2.2 General Arithmetic

" 3.2.2.1 Arithmetic
syn keyword racketFunc + - * / quotient remainder quotient/remainder modulo
syn keyword racketFunc add1 sub1 abs max min gcd lcm round exact-round floor
syn keyword racketFunc ceiling truncate numerator denominator rationalize

" 3.2.2.2 Number Comparison
syn keyword racketFunc = < <= > >=

" 3.2.2.3 Powers and Roots
syn keyword racketFunc sqrt integer-sqrt integer-sqrt/remainder
syn keyword racketFunc expt exp log

" 3.2.2.3 Trigonometric Functions
syn keyword racketFunc sin cos tan asin acos atan

" 3.2.2.4 Complex Numbers
syn keyword racketFunc make-rectangular make-polar
syn keyword racketFunc real-part imag-part magnitude angle
syn keyword racketFunc bitwise-ior bitwise-and bitwise-xor bitwise-not
syn keyword racketFunc bitwise-bit-set? bitwise-bit-field arithmetic-shift
syn keyword racketFunc integer-length

" 3.2.2.5 Random Numbers
syn keyword racketFunc random random-seed
syn keyword racketFunc make-pseudo-random-generator pseudo-random-generator?
syn keyword racketFunc current-pseudo-random-generator pseudo-random-generator->vector
syn keyword racketFunc vector->pseudo-random-generator vector->pseudo-random-generator!

" 3.2.2.8 Number-String Conversions
syn keyword racketFunc number->string string->number real->decimal-string
syn keyword racketFunc integer->integer-bytes
syn keyword racketFunc floating-point-bytes->real real->floating-point-bytes
syn keyword racketFunc system-big-endian?

" 3.2.2.9 Extra Constants and Functions
syn keyword racketFunc pi sqr sgn conjugate sinh cosh tanh order-of-magnitude

" 3.2.3 Flonums

" 3.2.3.1 Flonum Arithmetic
syn keyword racketFunc fl+ fl- fl* fl/ flabs
syn keyword racketFunc fl= fl< fl> fl<= fl>= flmin flmax
syn keyword racketFunc flround flfloor flceiling fltruncate
syn keyword racketFunc flsin flcos fltan flasin flacos flatan
syn keyword racketFunc fllog flexp flsqrt
syn keyword racketFunc ->fl fl->exact-integer make-flrectangular
syn keyword racketFunc flreal-part flimag-part

" 3.2.3.2 Flonum Vectors
syn keyword racketFunc flvector? flvector make-flvector flvector-length
syn keyword racketFunc flvector-ref flvector-set! flvector-copy in-flvector
syn keyword racketFunc shared-flvector make-shared-flvector
syn keyword racketSyntax for/flvector for*/flvector

" 3.2.4 Fixnums
syn keyword racketFunc fx+ fx- fx* fxquotient fxremainder fxmodulo fxabs
syn keyword racketFunc fxand fxior fxxor fxnot fxlshift fxrshift
syn keyword racketFunc fx= fx< fx> fx<= fx>= fxmin fxmax fx->fl fl->fx

" 3.2.4.2 Fixnum Vectors
syn keyword racketFunc fxvector? fxvector make-fxvector fxvector-length
syn keyword racketFunc fxvector-ref fxvector-set! fxvector-copy in-fxvector
syn keyword racketFunc for/fxvector for*/fxvector
syn keyword racketFunc shared-fxvector make-shared-fxvector

" 3.3 Strings
syn keyword racketFunc string? make-string string string->immutable-string string-length
syn keyword racketFunc string-ref string-set! substring string-copy string-copy!
syn keyword racketFunc string-fill! string-append string->list list->string
syn keyword racketFunc build-string string=? string<? string<=? string>? string>=?
syn keyword racketFunc string-ci=? string-ci<? string-ci<=? string-ci>? string-ci>=?
syn keyword racketFunc string-upcase string-downcase string-titlecase string-foldcase
syn keyword racketFunc string-normalize-nfd string-normalize-nfc string-normalize-nfkc
syn keyword racketFunc string-normalize-spaces string-trim
syn keyword racketFunc string-locale=? string-locale>? string-locale<?
syn keyword racketFunc string-locale-ci=? string-locale<=?
syn keyword racketFunc string-locale-upcase string-locale-downcase
syn keyword racketFunc string-append* string-join

" 3.4 Bytestrings
syn keyword racketFunc bytes? make-bytes bytes bytes->immutable-bytes byte?
syn keyword racketFunc bytes-length bytes-ref bytes-set! subbytes bytes-copy
syn keyword racketFunc bytes-copy! bytes-fill! bytes-append bytes->list list->bytes
syn keyword racketFunc make-shared-bytes shared-bytes
syn keyword racketFunc bytes=? bytes<? bytes>?
syn keyword racketFunc bytes->string/utf-8 bytes->string/latin-1
syn keyword racketFunc string->bytes/locale string->bytes/latin-1 string->bytes/utf-8
syn keyword racketFunc string-utf-8-length bytes-utf8-ref bytes-utf-8-index
syn keyword racketFunc bytes-open-converter bytes-close-converter
syn keyword racketFunc bytes-convert bytes-convert-end bytes-converter?
syn keyword racketFunc locale-string-encoding

" 3.5 Characters
syn keyword racketFunc char? char->integer integer->char
syn keyword racketFunc char=? char<? char<=? char>? char>=?
syn keyword racketFunc char-ci=? char-ci<? char-ci<=? char-ci>? char-ci>=?
syn keyword racketFunc char-alphabetic? char-lowercase? char-uppercase? char-title-case?
syn keyword racketFunc char-numeric? char-symbolic? char-punctuation? char-graphic?
syn keyword racketFunc char-whitespace? char-blank?
syn keyword racketFunc char-iso-control? char-general-category
syn keyword racketFunc make-known-char-range-list
syn keyword racketFunc char-upcase char-downcase char-titlecase char-foldcase

" 3.6 Symbols
syn keyword racketFunc symbol? symbol-interned? symbol-unreadable?
syn keyword racketFunc symbol->string string->symbol
syn keyword racketFunc string->uninterned-symbol string->unreadable-symbol
syn keyword racketFunc gensym

" 3.7 Regular Expressions
syn keyword racketFunc regexp? pregexp? byte-regexp? byte-pregexp?
syn keyword racketFunc regexp pregexp byte-regexp byte-pregexp
syn keyword racketFunc regexp-quote regexp-match regexp-match*
syn keyword racketFunc regexp-try-match regexp-match-positions
syn keyword racketFunc regexp-match-positions* regexp-match?
syn keyword racketFunc regexp-match-peek-positions regexp-match-peek-immediate
syn keyword racketFunc regexp-match-peek regexp-match-peek-positions*
syn keyword racketFunc regexp-match/end regexp-match-positions/end
syn keyword racketFunc regexp-match-peek-positions-immediat/end
syn keyword racketFunc regexp-split regexp-replace regexp-replace*
syn keyword racketFunc regexp-replace-quote

" 3.8 Keywords
syn keyword racketFunc keyword? keyword->string string->keyword keyword<?

" 3.9 Pairs and Lists
syn keyword racketFunc pair? null? cons car cdr null
syn keyword racketFunc list? list list* build-list length
syn keyword racketFunc list-ref list-tail append reverse map andmap ormap
syn keyword racketFunc for-each foldl foldr filter remove remq remv remove*
syn keyword racketFunc remq* remv* sort member memv memq memf
syn keyword racketFunc findf assoc assv assq assf
syn keyword racketFunc caar cadr cdar cddr caaar caadr cadar caddr cdaar
syn keyword racketFunc cddar cdddr caaaar caaadr caadar caaddr cadadr caddar
syn keyword racketFunc cadddr cdaaar cdaadr cdadar cddaar cdddar cddddr

" 3.9.7 Additional List Functions and Synonyms
" (require racket/list)
syn keyword racketFunc empty cons? empty? first rest
syn keyword racketFunc second third fourth fifth sixth seventh eighth ninth tenth
syn keyword racketFunc last last-pair make-list take drop split-at
syn keyword racketFunc take-right drop-right split-at-right add-between
syn keyword racketFunc append* flatten remove-duplicates filter-map
syn keyword racketFunc count partition append-map filter-not shuffle
syn keyword racketFunc argmin argmax make-reader-graph placeholder? make-placeholder
syn keyword racketFunc placeholder-set! placeholder-get hash-placeholder?
syn keyword racketFunc make-hash-placeholder make-hasheq-placeholder
syn keyword racketFunc make-hasheqv-placeholder make-immutable-hasheqv

" 3.10 Mutable Pairs and Lists
syn keyword racketFunc mpair? mcons mcar mcdr

" 3.11 Vectors
syn keyword racketFunc vector?  make-vector vector vector-immutable vector-length
syn keyword racketFunc vector-ref vector-set!  vector->list list->vector
syn keyword racketFunc vector->immutable-vector vector-fill!  vector-copy!
syn keyword racketFunc vector->values build-vector vector-set*!  vector-map
syn keyword racketFunc vector-map!  vector-append vector-take vector-take-right
syn keyword racketFunc vector-drop vector-drop-right vector-split-at
syn keyword racketFunc vector-split-at-right vector-copy vector-filter
syn keyword racketFunc vector-filter-not vector-count vector-argmin vector-argmax
syn keyword racketFunc vector-member vector-memv vector-memq

" 3.12 Boxes
syn keyword racketFunc box?  box box-immutable unbox set-box!

" 3.13 Hash Tables
syn keyword racketFunc hash? hash-equal? hash-eqv? hash-eq? hash-weak? hash
syn keyword racketFunc hasheq hasheqv
syn keyword racketFunc make-hash make-hasheqv make-hasheq make-weak-hash make-weak-hasheqv
syn keyword racketFunc make-weak-hasheq make-immutable-hash make-immutable-hasheqv
syn keyword racketFunc make-immutable-hasheq
syn keyword racketFunc hash-set! hash-set*! hash-set hash-set* hash-ref hash-ref!
syn keyword racketFunc hash-has-key? hash-update! hash-update hash-remove!
syn keyword racketFunc hash-remove hash-map hash-keys hash-values
syn keyword racketFunc hash->list hash-for-each hash-count
syn keyword racketFunc hash-iterate-first hash-iterate-next hash-iterate-key
syn keyword racketFunc hash-iterate-value hash-copy eq-hash-code eqv-hash-code
syn keyword racketFunc equal-hash-code equal-secondary-hash-code

" 3.15 Dictionaries
syn keyword racketFunc dict? dict-mutable? dict-can-remove-keys? dict-can-functional-set?
syn keyword racketFunc dict-set! dict-set*! dict-set dict-set* dict-has-key? dict-ref
syn keyword racketFunc dict-ref! dict-update! dict-update dict-remove! dict-remove
syn keyword racketFunc dict-map dict-for-each dict-count dict-iterate-first dict-iterate-next
syn keyword racketFunc dict-iterate-key dict-iterate-value in-dict in-dict-keys
syn keyword racketFunc in-dict-values in-dict-pairs dict-keys dict-values
syn keyword racketFunc dict->list prop: dict prop: dict/contract dict-key-contract
syn keyword racketFunc dict-value-contract dict-iter-contract make-custom-hash
syn keyword racketFunc make-immutable-custom-hash make-weak-custom-hash

" 3.16 Sets
syn keyword racketFunc set seteqv seteq set-empty? set-count set-member?
syn keyword racketFunc set-add set-remove set-union set-intersect set-subtract
syn keyword racketFunc set-symmetric-difference set=? subset? proper-subset?
syn keyword racketFunc set-map set-for-each set? set-equal? set-eqv? set-eq?
syn keyword racketFunc set/c in-set for/set for/seteq for/seteqv for*/set
syn keyword racketFunc for*/seteq for*/seteqv list->set list->seteq
syn keyword racketFunc list->seteqv set->list

" 3.17 Procedures
syn keyword racketFunc procedure? apply compose compose1 procedure-rename procedure->method
syn keyword racketFunc keyword-apply procedure-arity procedure-arity?
syn keyword racketFunc procedure-arity-includes? procedure-reduce-arity
syn keyword racketFunc procedure-keywords make-keyword-procedure
syn keyword racketFunc procedure-reduce-keyword-arity procedure-struct-type?
syn keyword racketFunc procedure-extract-target checked-procedure-check-and-extract
syn keyword racketFunc primitive? primitive-closure? primitive-result-arity
syn keyword racketFunc identity const thunk thunk* negate curry curryr

" 3.18 Void
syn keyword racketFunc void void?

" 4.1 Defining Structure Types
syn keyword racketFunc struct struct-field-index define-struct define-struct define-struct/derived

" 4.2 Creating Structure Types
syn keyword racketFunc make-struct-type make-struct-field-accessor make-struct-field-mutator

" 4.3 Structure Type Properties
syn keyword racketFunc make-struct-type-property struct-type-property? struct-type-property-accessor-procedure?

" 4.4 Copying and Updating Structures
syn keyword racketFunc struct-copy

" 4.5 Structure Utilities
syn keyword racketFunc struct->vector struct? struct-type?
syn keyword racketFunc struct-constructor-procedure? struct-predicate-procedure? struct-accessor-procedure? struct-mutator-procedure?
syn keyword racketFunc prefab-struct-key make-prefab-struct prefab-key->struct-type

" 4.6 Structure Type Transformer Binding
syn keyword racketFunc struct-info? check-struct-info? make-struct-info extract-struct-info
syn keyword racketFunc struct-auto-info? struct-auto-info-lists

" 5.1 Creating Interfaces
syn keyword racketFunc interface interface*

" 5.2 Creating Classes
syn keyword racketFunc class* class inspect
syn keyword racketFunc init init-field field inherit field init-rest
syn keyword racketFunc public public* pubment pubment* public-final public-final*
syn keyword racketFunc override override* overment overment* override-final override-final*
syn keyword racketFunc augride augride* augment augment* augment-final augment-final*
syn keyword racketFunc abstract inherit inherit/super inherit/inner
syn keyword racketFunc rename-inner rename-super
syn keyword racketFunc define/public define/pubment define/public-final
syn keyword racketFunc define/override define/overment define/override-final
syn keyword racketFunc define/augride define/augment define/augment-final
syn keyword racketFunc private* define/private

" 5.2.3 Methods
syn keyword racketFunc class/derived
syn keyword racketFunc super inner define-local-member-name define-member-name
syn keyword racketFunc member-name-key generate-member-key member-name-key?
syn keyword racketFunc member-name-key=? member-name-key-hash-code

" 5.3 Creating Objects
syn keyword racketFunc make-object instantiate new
syn keyword racketFunc super-make-object super-instantiate super-new

"5.4 Field and Method Access
syn keyword racketFunc method-id send send/apply send/keyword-apply dynamic-send send*
syn keyword racketFunc get-field set-field! field-bound?
syn keyword racketFunc class-field-accessor class-field-mutator

"5.4.3 Generics
syn keyword racketFunc generic send-generic make-generic

" 8.1 Data-strucure contracts
syn keyword racketFunc flat-contract-with-explanation flat-named-contract
" TODO where do any/c and none/c `value`s go?
syn keyword racketFunc or/c first-or/c and/c not/c =/c </c >/c <=/c >=/c
syn keyword racketFunc between/c real-in integer-in char-in natural-number/c
syn keyword racketFunc string-len/c printable/c one-of/c symbols vectorof
syn keyword racketFunc vector-immutableof vector/c box/c box-immutable/c listof
syn keyword racketFunc non-empty-listof list*of cons/c cons/dc list/c *list/c
syn keyword racketFunc syntax/c struct/c struct/dc parameter/c
syn keyword racketFunc procedure-arity-includes/c hash/c hash/dc channel/c
syn keyword racketFunc prompt-tag/c continuation-mark-key/c evt/c promise/c
syn keyword racketFunc flat-contract flat-contract-predicate suggest/c

" 9.1 Multiple Values
syn keyword racketFunc values call-with-values

" 10.2.2 Raising Exceptions
syn keyword racketFunc raise error raise-user-error raise-argument-error
syn keyword racketFunc raise-result-error raise-argument-error raise-range-error
syn keyword racketFunc raise-type-error raise-mismatch-error raise-arity-error
syn keyword racketFunc raise-syntax-error

" 10.2.3 Handling Exceptions
syn keyword racketFunc call-with-exception-handler uncaught-exception-handler

" 10.2.4 Configuring Default Handlers
syn keyword racketFunc error-escape-handler error-display-handler error-print-width
syn keyword racketFunc error-print-context-length error-values->string-handler
syn keyword racketFunc error-print-source-location

" 10.2.5 Built-in Exception Types
syn keyword racketFunc exn exn:fail exn:fail:contract exn:fail:contract:arity
syn keyword racketFunc exn:fail:contract:divide-by-zero exn:fail:contract:non-fixnum-result
syn keyword racketFunc exn:fail:contract:continuation exn:fail:contract:variable
syn keyword racketFunc exn:fail:syntax exn:fail:syntax:unbound exn:fail:syntax:missing-module
syn keyword racketFunc exn:fail:read exn:fail:read:eof exn:fail:read:non-char
syn keyword racketFunc exn:fail:filesystem exn:fail:filesystem:exists
syn keyword racketFunc exn:fail:filesystem:version exn:fail:filesystem:errno
syn keyword racketFunc exn:fail:filesystem:missing-module
syn keyword racketFunc exn:fail:network exn:fail:network:errno exn:fail:out-of-memory
syn keyword racketFunc exn:fail:unsupported exn:fail:user
syn keyword racketFunc exn:break exn:break:hang-up exn:break:terminate

" 10.3 Delayed Evaluation
syn keyword racketFunc promise? delay lazy force promise-forced? promise-running?

" 10.3.1 Additional Promise Kinds
syn keyword racketFunc delay/name promise/name delay/strict delay/sync delay/thread delay/idle

" 10.4 Continuations
syn keyword racketFunc call-with-continuation-prompt abort-current-continuation make-continuation-prompt-tag
syn keyword racketFunc default-continuation-prompt-tag call-with-current-continuation call/cc
syn keyword racketFunc call-with-composable-continuation call-with-escape-continuation call/ec
syn keyword racketFunc call-with-continuation-barrier continuation-prompt-available
syn keyword racketFunc continuation? continuation-prompt-tag dynamic-wind

" 10.4.1 Additional Control Operators
syn keyword racketFunc call/prompt abort/cc call/comp abort fcontrol spawn splitter new-prompt

" 11.3.2 Parameters
syn keyword racketFunc make-parameter make-derived-parameter parameter?
syn keyword racketFunc parameter-procedure=? current-parameterization
syn keyword racketFunc call-with-parameterization parameterization?

" 14.1.1 Manipulating Paths
syn keyword racketFunc path? path-string? path-for-some-system? string->path path->string path->bytes
syn keyword racketFunc string->path-element bytes->path-element path-element->string path-element->bytes
syn keyword racketFunc path-convention-type system-path-convention-type build-type
syn keyword racketFunc build-type/convention-type
syn keyword racketFunc absolute-path? relative-path? complete-path?
syn keyword racketFunc path->complete-path path->directory-path
syn keyword racketFunc resolve-path cleanse-path expand-user-path simplify-path normal-case-path split-path
syn keyword racketFunc path-replace-suffix path-add-suffix

" 14.1.2 More Path Utilities
syn keyword racketFunc explode-path file-name-from-path filename-extension find-relative-path normalize-path
syn keyword racketFunc path-element? path-only simple-form-path some-simple-path->string string->some-system-path

" 15.6 Time
syn keyword racketFunc current-seconds current-inexact-milliseconds
syn keyword racketFunc seconds->date current-milliseconds


syn match racketDelimiter !\<\.\>!

syn match racketSymbol    ,\k+,  contained

syn cluster racketNormal  contains=racketSyntax,racketFunc,racketDelimiter
syn cluster racketQuotedStuff  contains=racketSymbol
syn cluster racketQuotedOrNormal  contains=racketDelimiter

syn match racketConstant  ,\<\*\k\+\*\>,
syn match racketConstant  ,\<<\k\+>\>,

syn region racketQuotedStruc start="("rs=s+1 end=")"re=e-1     contains=@racketQuotedStuff,@racketQuotedOrNormal contained
syn region racketQuotedStruc start="#("rs=s+2 end=")"re=e-1    contains=@racketQuotedStuff,@racketQuotedOrNormal contained
syn region racketQuotedStruc start="{"rs=s+1 end="}"re=e-1   contains=@racketQuotedStuff,@racketQuotedOrNormal contained
syn region racketQuotedStruc start="#{"rs=s+2 end="}"re=e-1  contains=@racketQuotedStuff,@racketQuotedOrNormal contained
syn region racketQuotedStruc start="\["rs=s+1 end="\]"re=e-1   contains=@racketQuotedStuff,@racketQuotedOrNormal contained
syn region racketQuotedStruc start="#\["rs=s+2 end="\]"re=e-1  contains=@racketQuotedStuff,@racketQuotedOrNormal contained

syn cluster racketQuotedStuff  add=racketQuotedStruc

" Non-quoted lists, and strings
syn region racketStruc matchgroup=Delimiter start="("rs=s+1 matchgroup=Delimiter end=")"re=e-1 contains=@racketNormal
syn region racketStruc matchgroup=Delimiter start="#("rs=s+2 matchgroup=Delimiter end=")"re=e-1 contains=@racketNormal
syn region racketStruc matchgroup=Delimiter start="{"rs=s+1 matchgroup=Delimiter end="}"re=e-1 contains=@racketNormal
syn region racketStruc matchgroup=Delimiter start="#{"rs=s+2 matchgroup=Delimiter end="}"re=e-1 contains=@racketNormal
syn region racketStruc matchgroup=Delimiter start="\["rs=s+1 matchgroup=Delimiter end="\]"re=e-1 contains=@racketNormal
syn region racketStruc matchgroup=Delimiter start="#\["rs=s+2 matchgroup=Delimiter end="\]"re=e-1 contains=@racketNormal

" Simple literals
syn region racketString start=/\%(\\\)\@<!"/ skip=/\\[\\"]/ end=/"/
syn region racketString start=/#<<\z(.*\)$/ end=/^\z1$/

syn cluster racketNormal  add=racketError,racketConstant,racketStruc,racketString
syn cluster racketQuotedOrNormal  add=racketString

" Numbers

" anything which doesn't match the below rules, but starts with a #d, #b, #o,
" #x, #i, or #e, is an error
syn match racketNumberError         "\<#[xdobie]\k*"

syn match racketContainedNumberError   "\<#o\k*[^-+0-7delfinas#./@]\>"
syn match racketContainedNumberError   "\<#b\k*[^-+01delfinas#./@]\>"
syn match racketContainedNumberError   "\<#[ei]#[ei]"
syn match racketContainedNumberError   "\<#[xdob]#[xdob]"

" start with the simpler sorts
syn match racketNumber    "\<\(#[dobie]\)\{0,2}[-+]\?\(\d\+\|\d\+#*\.\|\d*\.\d\+\)#*\(/\d\+#*\)\?\([sdlef][-+]\?\d\+#*\)\?\>" contains=racketContainedNumberError
syn match racketNumber    "\<\(#[dobie]\)\{0,2}[-+]\?\d\+/\d\+\>" contains=racketContainedNumberError
syn match racketNumber    "\<\(#[dobie]\)\{0,2}[-+]\?\d\+/\d\+[-+]\d\+\(/\d\+\)\?i\>" contains=racketContainedNumberError

" different possible ways of expressing complex values
syn match racketNumber    "\<\(#[dobie]\)\{0,2}[-+]\(\d\+\|\d\+#*\.\|\d*\.\d\+\)#*\(/\d\+#*\)\?\([sdlef][-+]\?\d\+#*\)\?i\>" contains=racketContainedNumberError
syn match racketNumber    "\<\(#[dobie]\)\{0,2}[-+]\?\(\d\+\|\d\+#*\.\|\d*\.\d\+\)#*\(/\d\+#*\)\?\([sdlef][-+]\?\d\+#*\)\?[-+]\(\d\+\|\d\+#*\.\|\d*\.\d\+\)#*\(/\d\+#*\)\?\([sdlef][-+]\?\d\+#*\)\?i\>" contains=racketContainedNumberError
syn match racketNumber    "\<\(#[dobie]\)\{0,2}[-+]\(inf\|nan\)\.[0f][-+]\(\d\+\|\d\+#*\.\|\d*\.\d\+\)#*\(/\d\+#*\)\?\([sdlef][-+]\?\d\+#*\)\?i\>" contains=racketContainedNumberError
syn match racketNumber    "\<\(#[dobie]\)\{0,2}[-+]\?\(\d\+\|\d\+#*\.\|\d*\.\d\+\)#*\(/\d\+#*\)\?\([sdlef][-+]\?\d\+#*\)\?[-+]\(inf\|nan\)\.[0f]i\>" contains=racketContainedNumberError
syn match racketNumber    "\<\(#[dobie]\)\{0,2}[-+]\?\(\d\+\|\d\+#*\.\|\d*\.\d\+\)#*\(/\d\+#*\)\?\([sdlef][-+]\?\d\+#*\)\?@[-+]\?\(\d\+\|\d\+#*\.\|\d*\.\d\+\)#*\(/\d\+#*\)\?\([sdlef][-+]\?\d\+#*\)\?\>" contains=racketContainedNumberError
syn match racketNumber    "\<\(#[dobie]\)\{0,2}[-+]\(inf\|nan\)\.[0f]@[-+]\?\(\d\+\|\d\+#*\.\|\d*\.\d\+\)#*\(/\d\+#*\)\?\([sdlef][-+]\?\d\+#*\)\?\>" contains=racketContainedNumberError
syn match racketNumber    "\<\(#[dobie]\)\{0,2}[-+]\?\(\d\+\|\d\+#*\.\|\d*\.\d\+\)#*\(/\d\+#*\)\?\([sdlef][-+]\?\d\+#*\)\?@[-+]\(inf\|nan\)\.[0f]\>" contains=racketContainedNumberError

" hex versions of the above (separate because of the different possible exponent markers)
syn match racketNumber    "\<\(#x\|#[ei]#x\|#x#[ei]\)[-+]\?\(\x\+\|\x\+#*\.\|\x*\.\x\+\)#*\(/\x\+#*\)\?\([sl][-+]\?\x\+#*\)\?\>"
syn match racketNumber    "\<\(#x\|#[ei]#x\|#x#[ei]\)[-+]\?\x\+/\x\+\>"
syn match racketNumber    "\<\(#x\|#[ei]#x\|#x#[ei]\)[-+]\?\x\+/\x\+[-+]\x\+\(/\x\+\)\?i\>"

syn match racketNumber    "\<\(#x\|#[ei]#x\|#x#[ei]\)[-+]\(\x\+\|\x\+#*\.\|\x*\.\x\+\)#*\(/\x\+#*\)\?\([sl][-+]\?\x\+#*\)\?i\>"
syn match racketNumber    "\<\(#x\|#[ei]#x\|#x#[ei]\)[-+]\?\(\x\+\|\x\+#*\.\|\x*\.\x\+\)#*\(/\x\+#*\)\?\([sl][-+]\?\x\+#*\)\?[-+]\(\x\+\|\x\+#*\.\|\x*\.\x\+\)#*\(/\x\+#*\)\?\([sl][-+]\?\x\+#*\)\?i\>"
syn match racketNumber    "\<\(#x\|#[ei]#x\|#x#[ei]\)[-+]\(inf\|nan\)\.[0f][-+]\(\x\+\|\x\+#*\.\|\x*\.\x\+\)#*\(/\x\+#*\)\?\([sl][-+]\?\x\+#*\)\?i\>"
syn match racketNumber    "\<\(#x\|#[ei]#x\|#x#[ei]\)[-+]\?\(\x\+\|\x\+#*\.\|\x*\.\x\+\)#*\(/\x\+#*\)\?\([sl][-+]\?\x\+#*\)\?[-+]\(inf\|nan\)\.[0f]i\>"
syn match racketNumber    "\<\(#x\|#[ei]#x\|#x#[ei]\)[-+]\?\(\x\+\|\x\+#*\.\|\x*\.\x\+\)#*\(/\x\+#*\)\?\([sl][-+]\?\x\+#*\)\?@[-+]\?\(\x\+\|\x\+#*\.\|\x*\.\x\+\)#*\(/\x\+#*\)\?\([sl][-+]\?\x\+#*\)\?\>"
syn match racketNumber    "\<\(#x\|#[ei]#x\|#x#[ei]\)[-+]\(inf\|nan\)\.[0f]@[-+]\?\(\x\+\|\x\+#*\.\|\x*\.\x\+\)#*\(/\x\+#*\)\?\([sl][-+]\?\x\+#*\)\?\>"
syn match racketNumber    "\<\(#x\|#[ei]#x\|#x#[ei]\)[-+]\?\(\x\+\|\x\+#*\.\|\x*\.\x\+\)#*\(/\x\+#*\)\?\([sl][-+]\?\x\+#*\)\?@[-+]\(inf\|nan\)\.[0f]\>"

" these work for any radix
syn match racketNumber    "\<\(#[xdobie]\)\{0,2}[-+]\(inf\|nan\)\.[0f]i\?\>" contains=racketContainedNumberError
syn match racketNumber    "\<\(#[xdobie]\)\{0,2}[-+]\(inf\|nan\)\.[0f][-+]\(inf\|nan\)\.[0f]i\>" contains=racketContainedNumberError
syn match racketNumber    "\<\(#[xdobie]\)\{0,2}[-+]\(inf\|nan\)\.[0f]@[-+]\(inf\|nan\)\.[0f]\>" contains=racketContainedNumberError

syn keyword racketBoolean  #t #f #true #false #T #F

syn match racketError   "\<#\\\k*\>"

syn match racketChar    "\<#\\.\w\@!"
syn match racketChar    "\<#\\space\>"
syn match racketChar    "\<#\\newline\>"
syn match racketChar    "\<#\\return\>"
syn match racketChar    "\<#\\null\?\>"
syn match racketChar    "\<#\\backspace\>"
syn match racketChar    "\<#\\tab\>"
syn match racketChar    "\<#\\linefeed\>"
syn match racketChar    "\<#\\vtab\>"
syn match racketChar    "\<#\\page\>"
syn match racketChar    "\<#\\rubout\>"
syn match racketChar    "\<#\\[0-7]\{1,3}\>"
syn match racketChar    "\<#\\x[0-9a-f]\{1,2}\>"
syn match racketChar    "\<#\\u[0-9a-f]\{1,6}\>"

syn cluster racketNormal  add=racketNumber,racketBoolean,racketChar
syn cluster racketQuotedOrNormal  add=racketNumber,racketBoolean

" Command-line parsing
syn keyword racketExtFunc command-line current-command-line-arguments once-any help-labels multi once-each

syn match racketSyntax    "#lang "
syn match racketExtSyntax "#:\k\+"

syn cluster racketNormal  add=racketExtFunc,racketExtSyntax

" syntax quoting, unquoting and quasiquotation
syn region racketQuoted matchgroup=Delimiter start="['`]" end=![ \t()\[\]";]!me=e-1 contains=@racketQuotedStuff,@racketQuotedOrNormal
syn region racketQuoted matchgroup=Delimiter start="['`](" matchgroup=Delimiter end=")" contains=@racketQuotedStuff,@racketQuotedOrNormal
syn region racketQuoted matchgroup=Delimiter start="['`]\?#(" matchgroup=Delimiter end=")" contains=@racketQuotedStuff,@racketQuotedOrNormal

syn region racketUnquote matchgroup=Delimiter start="#,"rs=s+2 end=![ \t\[\]()";]!re=e-1,me=e-1 contained contains=@racketNormal
syn region racketUnquote matchgroup=Delimiter start="#,@"rs=s+3 end=![ \t\[\]()";]!re=e-1,me=e-1 contained contains=@racketNormal
syn region racketUnquote matchgroup=Delimiter start="#,("rs=s+3 end=")"re=e-1 contained contains=@racketNormal
syn region racketUnquote matchgroup=Delimiter start="#,@("rs=s+4 end=")"re=e-1 contained contains=@racketNormal
syn region racketUnquote matchgroup=Delimiter start="#,\["rs=s+3 end="\]"re=e-1 contained contains=@racketNormal
syn region racketUnquote matchgroup=Delimiter start="#,@\["rs=s+4 end="\]"re=e-1 contained contains=@racketNormal
syn region racketUnquote matchgroup=Delimiter start=","rs=s+1 end=![ \t\[\]()";]!re=e-1,me=e-1 contained contains=@racketNormal
syn region racketUnquote matchgroup=Delimiter start=",@"rs=s+2 end=![ \t\[\]()";]!re=e-1,me=e-1 contained contains=@racketNormal
syn region racketUnquote matchgroup=Delimiter start=",("rs=s+2 end=")"re=e-1 contained contains=@racketNormal
syn region racketUnquote matchgroup=Delimiter start=",@("rs=s+3 end=")"re=e-1 contained contains=@racketNormal
syn region racketUnquote matchgroup=Delimiter start=",#("rs=s+3 end=")"re=e-1 contained contains=@racketNormal
syn region racketUnquote matchgroup=Delimiter start=",@#("rs=s+4 end=")"re=e-1 contained contains=@racketNormal
syn region racketUnquote matchgroup=Delimiter start=",\["rs=s+2 end="\]"re=e-1 contained contains=@racketNormal
syn region racketUnquote matchgroup=Delimiter start=",@\["rs=s+3 end="\]"re=e-1 contained contains=@racketNormal
syn region racketUnquote matchgroup=Delimiter start=",#\["rs=s+3 end="\]"re=e-1 contained contains=@racketNormal
syn region racketUnquote matchgroup=Delimiter start=",@#\["rs=s+4 end="\]"re=e-1 contained contains=@racketNormal

syn cluster racketQuotedStuff add=racketUnquote

syn region racketQuoted matchgroup=Delimiter start="#['`]"rs=s+2 end=![ \t()\[\]";]!re=e-1,me=e-1 contains=@racketQuotedStuff,@racketQuotedOrNormal
syn region racketQuoted matchgroup=Delimiter start="#['`]("rs=s+3 matchgroup=Delimiter end=")"re=e-1 contains=@racketQuotedStuff,@racketQuotedOrNormal

" Comments
syn match racketComment /;.*$/ contains=racketTodo,racketNote,@Spell
syn region racketMultilineComment start=/#|/ end=/|#/ contains=racketMultilineComment,racketTodo,racketNote,@Spell

syn keyword racketTodo FIXME TODO XXX contained
syntax match racketNote /\CNOTE\ze:\?/ contained

syn cluster racketNormal  add=racketQuoted,racketComment,racketMultilineComment
syn cluster racketQuotedOrNormal  add=racketComment,racketMultilineComment


" Synchronization and the wrapping up...
syn sync match matchPlace grouphere NONE "^[^ \t]"
" ... i.e. synchronize on a line that starts at the left margin

" Define the default highlighting.
" For version 5.7 and earlier: only when not done already
" For version 5.8 and later: only when an item doesn't have highlighting yet
if version >= 508 || !exists("did_racket_syntax_inits")
  if version < 508
    let did_racket_syntax_inits = 1
    command -nargs=+ HiLink hi link <args>
  else
    command -nargs=+ HiLink hi def link <args>
  endif

  HiLink racketSyntax             Statement
  HiLink racketFunc               Function

  HiLink racketString             String
  HiLink racketChar               Character
  HiLink racketBoolean            Boolean

  HiLink racketNumber             Number
  HiLink racketNumberError        Error
  HiLink racketContainedNumberError Error

  HiLink racketQuoted             Structure
  HiLink racketQuotedStruc        Structure
  HiLink racketSymbol             Structure

  HiLink racketDelimiter          Delimiter
  HiLink racketConstant           Constant

  HiLink racketComment            Comment
  HiLink racketMultilineComment   Comment
  HiLink racketTodo               Todo
  HiLink racketNote               SpecialComment
  HiLink racketError              Error

  HiLink racketExtSyntax          Type
  HiLink racketExtFunc            PreProc
  delcommand HiLink
endif

let b:current_syntax = "racket"
