(number) @constant.numeric
(character) @constant.character
(boolean) @constant.builtin.boolean

[(string)
 (character)] @string

(escape_sequence) @constant.character.escape

[(comment)
 (block_comment)
 (directive)] @comment

[(boolean)
 (character)] @constant

((symbol) @function.builtin
 (#match? @function.builtin "^(eqv\\?|eq\\?|equal\\?)")) ; TODO

; keywords

((symbol) @keyword.conditional
 (#match? @keyword.conditional "^(if|cond|case|when|unless)$"))
 
((symbol) @keyword
 (#match? @keyword
  "^(define|lambda|begin|do|define-syntax|and|or|if|cond|case|when|unless|else|=>|let|let*|let-syntax|let-values|let*-values|letrec|letrec*|letrec-syntax|set!|syntax-rules|identifier-syntax|quote|unquote|quote-splicing|quasiquote|unquote-splicing|delay|assert|library|export|import|rename|only|except|prefix)$"))

; special forms

(list
 "["
 (symbol)+ @variable
 "]")

(list
 .
 (symbol) @_f
 .
 (list
   (symbol) @variable)
 (#eq? @_f "lambda"))

(list
 .
 (symbol) @_f
 .
 (list
   (list
     (symbol) @variable))
 (#match? @_f
  "^(let|let\\*|let-syntax|let-values|let\\*-values|letrec|letrec\\*|letrec-syntax)$"))

; operators

(list
  .
  (symbol) @operator
  (#match? @operator "^([+*/<>=-]|(<=)|(>=))$"))
  
; quote

(abbreviation
  "'" (symbol)) @constant

(list
 .
 (symbol) @_f
 (#eq? @_f "quote")) @symbol

; library

(list
 .
 (symbol) @_lib
 .
 (symbol) @namespace

 (#eq? @_lib "library"))

; procedure

(list
  .
  (symbol) @function)

;; variables

((symbol) @variable.builtin
 (#eq? @variable.builtin "..."))

(symbol) @variable
((symbol) @variable.builtin
 (#eq? @variable.builtin "."))

(symbol) @variable


["(" ")" "[" "]" "{" "}"] @punctuation.bracket