This file is indexed.

/usr/lib/ruby/vendor_ruby/rugments/lexers/racket.rb is in ruby-rugments 1.0.0~beta8-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
module Rugments
  module Lexers
    class Racket < RegexLexer
      title 'Racket'
      desc 'Racket is a Lisp descended from Scheme (racket-lang.org)'

      tag 'racket'
      filenames '*.rkt', '*.rktd', '*.rktl'
      mimetypes 'text/x-racket', 'application/x-racket'

      def self.analyze_text(text)
        text = text.strip
        return 1 if text.start_with? '#lang racket'
        return 0.6 if text =~ %r{\A#lang [a-z/-]+$}i
      end

      def self.keywords
        @keywords ||= Set.new %w(
          ... and begin begin-for-syntax begin0 case case-lambda cond
          datum->syntax-object define define-for-syntax define-logger
          define-struct define-syntax define-syntax-rule
          define-syntaxes define-values define-values-for-syntax delay
          do expand-path fluid-let force hash-table-copy
          hash-table-count hash-table-for-each hash-table-get
          hash-table-iterate-first hash-table-iterate-key
          hash-table-iterate-next hash-table-iterate-value
          hash-table-map hash-table-put! hash-table-remove!
          hash-table? if lambda let let* let*-values let-struct
          let-syntax let-syntaxes let-values let/cc let/ec letrec
          letrec-syntax letrec-syntaxes letrec-syntaxes+values
          letrec-values list-immutable make-hash-table
          make-immutable-hash-table make-namespace module module*
          module-identifier=? module-label-identifier=?
          module-template-identifier=? module-transformer-identifier=?
          namespace-transformer-require or parameterize parameterize*
          parameterize-break promise? prop:method-arity-error provide
          provide-for-label provide-for-syntax quasiquote quasisyntax
          quasisyntax/loc quote quote-syntax quote-syntax/prune
          require require-for-label require-for-syntax
          require-for-template set! set!-values syntax syntax-case
          syntax-case* syntax-id-rules syntax-object->datum
          syntax-rules syntax/loc tcp-abandon-port tcp-accept
          tcp-accept-evt tcp-accept-ready? tcp-accept/enable-break
          tcp-addresses tcp-close tcp-connect tcp-connect/enable-break
          tcp-listen tcp-listener? tcp-port? time transcript-off
          transcript-on udp-addresses udp-bind! udp-bound? udp-close
          udp-connect! udp-connected? udp-multicast-interface
          udp-multicast-join-group! udp-multicast-leave-group!
          udp-multicast-loopback? udp-multicast-set-interface!
          udp-multicast-set-loopback! udp-multicast-set-ttl!
          udp-multicast-ttl udp-open-socket udp-receive! udp-receive!*
          udp-receive!-evt udp-receive!/enable-break
          udp-receive-ready-evt udp-send udp-send* udp-send-evt
          udp-send-ready-evt udp-send-to udp-send-to* udp-send-to-evt
          udp-send-to/enable-break udp-send/enable-break udp? unless
          unquote unquote-splicing unsyntax unsyntax-splicing when
          with-continuation-mark with-handlers with-handlers*
          with-syntax λ)
      end

      def self.builtins
        @builtins ||= Set.new %w(
          * + - / < <= = > >=
          abort-current-continuation abs absolute-path? acos add1
          alarm-evt always-evt andmap angle append apply
          arithmetic-shift arity-at-least arity-at-least-value
          arity-at-least? asin assoc assq assv atan banner bitwise-and
          bitwise-bit-field bitwise-bit-set? bitwise-ior bitwise-not
          bitwise-xor boolean? bound-identifier=? box box-cas!
          box-immutable box? break-enabled break-thread build-path
          build-path/convention-type byte-pregexp byte-pregexp?
          byte-ready? byte-regexp byte-regexp? byte? bytes
          bytes->immutable-bytes bytes->list bytes->path
          bytes->path-element bytes->string/latin-1
          bytes->string/locale bytes->string/utf-8 bytes-append
          bytes-close-converter bytes-convert bytes-convert-end
          bytes-converter? bytes-copy bytes-copy!
          bytes-environment-variable-name? bytes-fill! bytes-length
          bytes-open-converter bytes-ref bytes-set! bytes-utf-8-index
          bytes-utf-8-length bytes-utf-8-ref bytes<? bytes=? bytes>?
          bytes? caaaar caaadr caaar caadar caaddr caadr caar cadaar
          cadadr cadar caddar cadddr caddr cadr call-in-nested-thread
          call-with-break-parameterization
          call-with-composable-continuation
          call-with-continuation-barrier call-with-continuation-prompt
          call-with-current-continuation
          call-with-default-reading-parameterization
          call-with-escape-continuation call-with-exception-handler
          call-with-immediate-continuation-mark call-with-input-file
          call-with-output-file call-with-parameterization
          call-with-semaphore call-with-semaphore/enable-break
          call-with-values call/cc call/ec car cdaaar cdaadr cdaar
          cdadar cdaddr cdadr cdar cddaar cddadr cddar cdddar cddddr
          cdddr cddr cdr ceiling channel-get channel-put
          channel-put-evt channel-put-evt? channel-try-get channel?
          chaperone-box chaperone-continuation-mark-key chaperone-evt
          chaperone-hash chaperone-of? chaperone-procedure
          chaperone-prompt-tag chaperone-struct chaperone-struct-type
          chaperone-vector chaperone? char->integer char-alphabetic?
          char-blank? char-ci<=? char-ci<? char-ci=? char-ci>=?
          char-ci>? char-downcase char-foldcase char-general-category
          char-graphic? char-iso-control? char-lower-case?
          char-numeric? char-punctuation? char-ready? char-symbolic?
          char-title-case? char-titlecase char-upcase char-upper-case?
          char-utf-8-length char-whitespace? char<=? char<? char=?
          char>=? char>? char? check-duplicate-identifier
          checked-procedure-check-and-extract choice-evt cleanse-path
          close-input-port close-output-port collect-garbage
          collection-file-path collection-path compile
          compile-allow-set!-undefined
          compile-context-preservation-enabled
          compile-enforce-module-constants compile-syntax
          compiled-expression? compiled-module-expression?
          complete-path? complex? cons continuation-mark-key?
          continuation-mark-set->context continuation-mark-set->list
          continuation-mark-set->list* continuation-mark-set-first
          continuation-mark-set? continuation-marks
          continuation-prompt-available? continuation-prompt-tag?
          continuation? copy-file cos current-break-parameterization
          current-code-inspector current-command-line-arguments
          current-compile current-compiled-file-roots
          current-continuation-marks current-custodian
          current-directory current-directory-for-user current-drive
          current-environment-variables current-error-port
          current-eval current-evt-pseudo-random-generator
          current-gc-milliseconds current-get-interaction-input-port
          current-inexact-milliseconds current-input-port
          current-inspector current-library-collection-paths
          current-load current-load-extension
          current-load-relative-directory current-load/use-compiled
          current-locale current-memory-use current-milliseconds
          current-module-declare-name current-module-declare-source
          current-module-name-resolver current-module-path-for-load
          current-namespace current-output-port
          current-parameterization
          current-preserved-thread-cell-values current-print
          current-process-milliseconds current-prompt-read
          current-pseudo-random-generator current-read-interaction
          current-reader-guard current-readtable current-seconds
          current-security-guard current-subprocess-custodian-mode
          current-thread current-thread-group
          current-thread-initial-stack-size
          current-write-relative-directory custodian-box-value
          custodian-box? custodian-limit-memory custodian-managed-list
          custodian-memory-accounting-available?
          custodian-require-memory custodian-shutdown-all custodian?
          custom-print-quotable-accessor custom-print-quotable?
          custom-write-accessor custom-write? date date*
          date*-nanosecond date*-time-zone-name date*? date-day
          date-dst? date-hour date-minute date-month date-second
          date-time-zone-offset date-week-day date-year date-year-day
          date? datum-intern-literal default-continuation-prompt-tag
          delete-directory delete-file denominator directory-exists?
          directory-list display displayln dump-memory-stats
          dynamic-require dynamic-require-for-syntax dynamic-wind
          environment-variables-copy environment-variables-names
          environment-variables-ref environment-variables-set!
          environment-variables? eof eof-object? ephemeron-value
          ephemeron? eprintf eq-hash-code eq? equal-hash-code
          equal-secondary-hash-code equal? equal?/recur eqv-hash-code
          eqv? error error-display-handler error-escape-handler
          error-print-context-length error-print-source-location
          error-print-width error-value->string-handler eval
          eval-jit-enabled eval-syntax even? evt? exact->inexact
          exact-integer? exact-nonnegative-integer?
          exact-positive-integer? exact? executable-yield-handler exit
          exit-handler exn exn-continuation-marks exn-message
          exn:break exn:break-continuation exn:break:hang-up
          exn:break:hang-up? exn:break:terminate exn:break:terminate?
          exn:break? exn:fail exn:fail:contract
          exn:fail:contract:arity exn:fail:contract:arity?
          exn:fail:contract:continuation
          exn:fail:contract:continuation?
          exn:fail:contract:divide-by-zero
          exn:fail:contract:divide-by-zero?
          exn:fail:contract:non-fixnum-result
          exn:fail:contract:non-fixnum-result?
          exn:fail:contract:variable exn:fail:contract:variable-id
          exn:fail:contract:variable? exn:fail:contract?
          exn:fail:filesystem exn:fail:filesystem:errno
          exn:fail:filesystem:errno-errno exn:fail:filesystem:errno?
          exn:fail:filesystem:exists exn:fail:filesystem:exists?
          exn:fail:filesystem:missing-module
          exn:fail:filesystem:missing-module-path
          exn:fail:filesystem:missing-module?
          exn:fail:filesystem:version exn:fail:filesystem:version?
          exn:fail:filesystem? exn:fail:network exn:fail:network:errno
          exn:fail:network:errno-errno exn:fail:network:errno?
          exn:fail:network? exn:fail:out-of-memory
          exn:fail:out-of-memory? exn:fail:read exn:fail:read-srclocs
          exn:fail:read:eof exn:fail:read:eof? exn:fail:read:non-char
          exn:fail:read:non-char? exn:fail:read? exn:fail:syntax
          exn:fail:syntax-exprs exn:fail:syntax:missing-module
          exn:fail:syntax:missing-module-path
          exn:fail:syntax:missing-module? exn:fail:syntax:unbound
          exn:fail:syntax:unbound? exn:fail:syntax?
          exn:fail:unsupported exn:fail:unsupported? exn:fail:user
          exn:fail:user? exn:fail? exn:missing-module-accessor
          exn:missing-module? exn:srclocs-accessor exn:srclocs? exn?
          exp expand expand-once expand-syntax expand-syntax-once
          expand-syntax-to-top-form expand-to-top-form
          expand-user-path explode-path expt file-exists?
          file-or-directory-identity file-or-directory-modify-seconds
          file-or-directory-permissions file-position file-position*
          file-size file-stream-buffer-mode file-stream-port?
          file-truncate filesystem-change-evt
          filesystem-change-evt-cancel filesystem-change-evt?
          filesystem-root-list find-executable-path
          find-library-collection-paths find-system-path fixnum?
          floating-point-bytes->real flonum? floor flush-output
          for-each format fprintf free-identifier=? gcd
          generate-temporaries gensym get-output-bytes
          get-output-string getenv global-port-print-handler guard-evt
          handle-evt handle-evt? hash hash-equal? hash-eqv?
          hash-has-key? hash-placeholder? hash-ref! hasheq hasheqv
          identifier-binding identifier-binding-symbol
          identifier-label-binding identifier-prune-lexical-context
          identifier-prune-to-source-module
          identifier-remove-from-definition-context
          identifier-template-binding identifier-transformer-binding
          identifier? imag-part immutable? impersonate-box
          impersonate-continuation-mark-key impersonate-hash
          impersonate-procedure impersonate-prompt-tag
          impersonate-struct impersonate-vector impersonator-ephemeron
          impersonator-of? impersonator-prop:application-mark
          impersonator-property-accessor-procedure?
          impersonator-property? impersonator? inexact->exact
          inexact-real? inexact? input-port? inspector? integer->char
          integer->integer-bytes integer-bytes->integer integer-length
          integer-sqrt integer-sqrt/remainder integer?
          internal-definition-context-seal
          internal-definition-context? keyword->string keyword<?
          keyword? kill-thread lcm length liberal-define-context?
          link-exists? list list* list->bytes list->string
          list->vector list-ref list-tail list? load load-extension
          load-on-demand-enabled load-relative load-relative-extension
          load/cd load/use-compiled local-expand
          local-expand/capture-lifts local-transformer-expand
          local-transformer-expand/capture-lifts
          locale-string-encoding log log-max-level magnitude
          make-arity-at-least make-bytes make-channel
          make-continuation-mark-key make-continuation-prompt-tag
          make-custodian make-custodian-box make-date make-date*
          make-derived-parameter make-directory
          make-environment-variables make-ephemeron make-exn
          make-exn:break make-exn:break:hang-up
          make-exn:break:terminate make-exn:fail
          make-exn:fail:contract make-exn:fail:contract:arity
          make-exn:fail:contract:continuation
          make-exn:fail:contract:divide-by-zero
          make-exn:fail:contract:non-fixnum-result
          make-exn:fail:contract:variable make-exn:fail:filesystem
          make-exn:fail:filesystem:errno
          make-exn:fail:filesystem:exists
          make-exn:fail:filesystem:missing-module
          make-exn:fail:filesystem:version make-exn:fail:network
          make-exn:fail:network:errno make-exn:fail:out-of-memory
          make-exn:fail:read make-exn:fail:read:eof
          make-exn:fail:read:non-char make-exn:fail:syntax
          make-exn:fail:syntax:missing-module
          make-exn:fail:syntax:unbound make-exn:fail:unsupported
          make-exn:fail:user make-file-or-directory-link
          make-hash-placeholder make-hasheq-placeholder make-hasheqv
          make-hasheqv-placeholder make-immutable-hasheqv
          make-impersonator-property make-input-port make-inspector
          make-known-char-range-list make-output-port make-parameter
          make-phantom-bytes make-pipe make-placeholder make-polar
          make-prefab-struct make-pseudo-random-generator
          make-reader-graph make-readtable make-rectangular
          make-rename-transformer make-resolved-module-path
          make-security-guard make-semaphore make-set!-transformer
          make-shared-bytes make-sibling-inspector
          make-special-comment make-srcloc make-string
          make-struct-field-accessor make-struct-field-mutator
          make-struct-type make-struct-type-property
          make-syntax-delta-introducer make-syntax-introducer
          make-thread-cell make-thread-group make-vector make-weak-box
          make-weak-hasheqv make-will-executor map max mcar mcdr mcons
          member memq memv min module->exports module->imports
          module->language-info module->namespace
          module-compiled-cross-phase-persistent?
          module-compiled-exports module-compiled-imports
          module-compiled-language-info module-compiled-name
          module-compiled-submodules module-declared?
          module-path-index-join module-path-index-resolve
          module-path-index-split module-path-index-submodule
          module-path-index? module-path? module-predefined?
          module-provide-protected? modulo mpair? nack-guard-evt
          namespace-attach-module namespace-attach-module-declaration
          namespace-base-phase namespace-mapped-symbols
          namespace-module-identifier namespace-module-registry
          namespace-require namespace-require/constant
          namespace-require/copy namespace-require/expansion-time
          namespace-set-variable-value! namespace-symbol->identifier
          namespace-syntax-introduce namespace-undefine-variable!
          namespace-unprotect-module namespace-variable-value
          namespace? negative? never-evt newline normal-case-path not
          null null? number->string number? numerator object-name odd?
          open-input-bytes open-input-file open-input-output-file
          open-input-string open-output-bytes open-output-file
          open-output-string ormap output-port? pair?
          parameter-procedure=? parameter? parameterization?
          path->bytes path->complete-path path->directory-path
          path->string path-add-suffix path-convention-type
          path-element->bytes path-element->string
          path-for-some-system? path-list-string->path-list
          path-replace-suffix path-string? path? peek-byte
          peek-byte-or-special peek-bytes peek-bytes!
          peek-bytes-avail! peek-bytes-avail!*
          peek-bytes-avail!/enable-break peek-char
          peek-char-or-special peek-string peek-string! phantom-bytes?
          pipe-content-length placeholder-get placeholder-set!
          placeholder? poll-guard-evt port-closed-evt port-closed?
          port-commit-peeked port-count-lines!
          port-count-lines-enabled port-counts-lines?
          port-display-handler port-file-identity port-file-unlock
          port-next-location port-print-handler port-progress-evt
          port-provides-progress-evts? port-read-handler
          port-try-file-lock? port-write-handler port-writes-atomic?
          port-writes-special? port? positive? prefab-key->struct-type
          prefab-key? prefab-struct-key pregexp pregexp?
          primitive-closure? primitive-result-arity primitive? print
          print-as-expression print-boolean-long-form print-box
          print-graph print-hash-table print-mpair-curly-braces
          print-pair-curly-braces print-reader-abbreviations
          print-struct print-syntax-width print-unreadable
          print-vector-length printf procedure->method procedure-arity
          procedure-arity-includes? procedure-arity?
          procedure-closure-contents-eq? procedure-extract-target
          procedure-reduce-arity procedure-rename
          procedure-struct-type? procedure? progress-evt?
          prop:arity-string prop:checked-procedure
          prop:custom-print-quotable prop:custom-write prop:equal+hash
          prop:evt prop:exn:missing-module prop:exn:srclocs
          prop:impersonator-of prop:input-port
          prop:liberal-define-context prop:output-port prop:procedure
          prop:rename-transformer prop:set!-transformer
          pseudo-random-generator->vector
          pseudo-random-generator-vector? pseudo-random-generator?
          putenv quotient quotient/remainder raise
          raise-argument-error raise-arguments-error raise-arity-error
          raise-mismatch-error raise-range-error raise-result-error
          raise-syntax-error raise-type-error raise-user-error random
          random-seed rational? rationalize read read-accept-bar-quote
          read-accept-box read-accept-compiled read-accept-dot
          read-accept-graph read-accept-infix-dot read-accept-lang
          read-accept-quasiquote read-accept-reader read-byte
          read-byte-or-special read-bytes read-bytes!
          read-bytes-avail! read-bytes-avail!*
          read-bytes-avail!/enable-break read-bytes-line
          read-case-sensitive read-char read-char-or-special
          read-curly-brace-as-paren read-decimal-as-inexact
          read-eval-print-loop read-language read-line
          read-on-demand-source read-square-bracket-as-paren
          read-string read-string! read-syntax read-syntax/recursive
          read/recursive readtable-mapping readtable?
          real->double-flonum real->floating-point-bytes
          real->single-flonum real-part real? regexp regexp-match
          regexp-match-peek regexp-match-peek-immediate
          regexp-match-peek-positions
          regexp-match-peek-positions-immediate
          regexp-match-peek-positions-immediate/end
          regexp-match-peek-positions/end regexp-match-positions
          regexp-match-positions/end regexp-match/end regexp-match?
          regexp-max-lookbehind regexp-replace regexp-replace* regexp?
          relative-path? remainder rename-file-or-directory
          rename-transformer-target rename-transformer? reroot-path
          resolve-path resolved-module-path-name resolved-module-path?
          reverse round seconds->date security-guard?
          semaphore-peek-evt semaphore-peek-evt? semaphore-post
          semaphore-try-wait? semaphore-wait
          semaphore-wait/enable-break semaphore?
          set!-transformer-procedure set!-transformer? set-box!
          set-mcar! set-mcdr! set-phantom-bytes!
          set-port-next-location! shared-bytes shell-execute
          simplify-path sin single-flonum? sleep special-comment-value
          special-comment? split-path sqrt srcloc srcloc->string
          srcloc-column srcloc-line srcloc-position srcloc-source
          srcloc-span srcloc? string string->bytes/latin-1
          string->bytes/locale string->bytes/utf-8
          string->immutable-string string->keyword string->list
          string->number string->path string->path-element
          string->symbol string->uninterned-symbol
          string->unreadable-symbol string-append string-ci<=?
          string-ci<? string-ci=? string-ci>=? string-ci>? string-copy
          string-copy! string-downcase
          string-environment-variable-name? string-fill!
          string-foldcase string-length string-locale-ci<?
          string-locale-ci=? string-locale-ci>? string-locale-downcase
          string-locale-upcase string-locale<? string-locale=?
          string-locale>? string-normalize-nfc string-normalize-nfd
          string-normalize-nfkc string-normalize-nfkd string-ref
          string-set! string-titlecase string-upcase
          string-utf-8-length string<=? string<? string=? string>=?
          string>? string? struct->vector struct-accessor-procedure?
          struct-constructor-procedure? struct-info
          struct-mutator-procedure? struct-predicate-procedure?
          struct-type-info struct-type-make-constructor
          struct-type-make-predicate
          struct-type-property-accessor-procedure?
          struct-type-property? struct-type? struct:arity-at-least
          struct:date struct:date* struct:exn struct:exn:break
          struct:exn:break:hang-up struct:exn:break:terminate
          struct:exn:fail struct:exn:fail:contract
          struct:exn:fail:contract:arity
          struct:exn:fail:contract:continuation
          struct:exn:fail:contract:divide-by-zero
          struct:exn:fail:contract:non-fixnum-result
          struct:exn:fail:contract:variable struct:exn:fail:filesystem
          struct:exn:fail:filesystem:errno
          struct:exn:fail:filesystem:exists
          struct:exn:fail:filesystem:missing-module
          struct:exn:fail:filesystem:version struct:exn:fail:network
          struct:exn:fail:network:errno struct:exn:fail:out-of-memory
          struct:exn:fail:read struct:exn:fail:read:eof
          struct:exn:fail:read:non-char struct:exn:fail:syntax
          struct:exn:fail:syntax:missing-module
          struct:exn:fail:syntax:unbound struct:exn:fail:unsupported
          struct:exn:fail:user struct:srcloc struct? sub1 subbytes
          subprocess subprocess-group-enabled subprocess-kill
          subprocess-pid subprocess-status subprocess-wait subprocess?
          substring symbol->string symbol-interned? symbol-unreadable?
          symbol? sync sync/enable-break sync/timeout
          sync/timeout/enable-break syntax->list syntax-arm
          syntax-column syntax-disarm syntax-e syntax-line
          syntax-local-bind-syntaxes syntax-local-certifier
          syntax-local-context syntax-local-expand-expression
          syntax-local-get-shadower syntax-local-introduce
          syntax-local-lift-context syntax-local-lift-expression
          syntax-local-lift-module-end-declaration
          syntax-local-lift-provide syntax-local-lift-require
          syntax-local-lift-values-expression
          syntax-local-make-definition-context
          syntax-local-make-delta-introducer
          syntax-local-module-defined-identifiers
          syntax-local-module-exports
          syntax-local-module-required-identifiers syntax-local-name
          syntax-local-phase-level syntax-local-submodules
          syntax-local-transforming-module-provides?
          syntax-local-value syntax-local-value/immediate
          syntax-original? syntax-position syntax-property
          syntax-property-symbol-keys syntax-protect syntax-rearm
          syntax-recertify syntax-shift-phase-level syntax-source
          syntax-source-module syntax-span syntax-taint
          syntax-tainted? syntax-track-origin
          syntax-transforming-module-expression? syntax-transforming?
          syntax? system-big-endian? system-idle-evt
          system-language+country system-library-subpath
          system-path-convention-type system-type tan terminal-port?
          thread thread-cell-ref thread-cell-set! thread-cell-values?
          thread-cell? thread-dead-evt thread-dead? thread-group?
          thread-resume thread-resume-evt thread-rewind-receive
          thread-running? thread-suspend thread-suspend-evt
          thread-wait thread/suspend-to-kill thread? time-apply
          truncate unbox uncaught-exception-handler
          use-collection-link-paths use-compiled-file-paths
          use-user-specific-search-paths values
          variable-reference->empty-namespace
          variable-reference->module-base-phase
          variable-reference->module-declaration-inspector
          variable-reference->module-path-index
          variable-reference->module-source
          variable-reference->namespace variable-reference->phase
          variable-reference->resolved-module-path
          variable-reference-constant? variable-reference? vector
          vector->immutable-vector vector->list
          vector->pseudo-random-generator
          vector->pseudo-random-generator! vector->values vector-fill!
          vector-immutable vector-length vector-ref vector-set!
          vector-set-performance-stats! vector? version void void?
          weak-box-value weak-box? will-execute will-executor?
          will-register will-try-execute with-input-from-file
          with-output-to-file wrap-evt write write-byte write-bytes
          write-bytes-avail write-bytes-avail* write-bytes-avail-evt
          write-bytes-avail/enable-break write-char write-special
          write-special-avail* write-special-evt write-string zero?
        )
      end

      # Since Racket allows identifiers to consist of nearly anything,
      # it's simpler to describe what an ID is _not_.
      id = /[^\s\(\)\[\]\{\}'`,.]+/i

      state :root do
        # comments
        rule /;.*$/, Comment::Single
        rule /\s+/m, Text

        rule /[+-]inf[.][f0]/, Num::Float
        rule /[+-]nan[.]0/, Num::Float
        rule /[-]min[.]0/, Num::Float
        rule /[+]max[.]0/, Num::Float

        rule /-?\d+\.\d+/, Num::Float
        rule /-?\d+/, Num::Integer

        rule /#:#{id}+/, Name::Tag  # keyword

        rule /#b[01]+/, Num::Bin
        rule /#o[0-7]+/, Num::Oct
        rule /#d[0-9]+/, Num::Integer
        rule /#x[0-9a-f]+/i, Num::Hex
        rule /#[ei][\d.]+/, Num::Other

        rule /"(\\\\|\\"|[^"])*"/, Str
        rule /['`]#{id}/i, Str::Symbol
        rule /#\\([()\/'"._!\$%& ?=+-]{1}|[a-z0-9]+)/i,
             Str::Char
        rule /#t|#f/, Name::Constant
        rule /(?:'|#|`|,@|,|\.)/, Operator

        rule /(['#])(\s*)(\()/m do
          groups Str::Symbol, Text, Punctuation
        end

        # () [] {} are all permitted as like pairs
        rule /\(|\[|\{/, Punctuation, :command
        rule /\)|\]|\}/, Punctuation

        rule id, Name::Variable
      end

      state :command do
        rule id, Name::Function do |m|
          if self.class.keywords.include? m[0]
            token Keyword
          elsif self.class.builtins.include? m[0]
            token Name::Builtin
          else
            token Name::Function
          end

          pop!
        end

        rule(//) { pop! }
      end
    end
  end
end