scheme.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. /*
  2. Language: Scheme
  3. Description: Keywords based on http://community.schemewiki.org/?scheme-keywords
  4. Author: JP Verkamp <[email protected]>
  5. Contributors: Ivan Sagalaev <[email protected]>
  6. Origin: clojure.js
  7. Category: lisp
  8. */
  9. function(hljs) {
  10. var SCHEME_IDENT_RE = '[^\\(\\)\\[\\]\\{\\}",\'`;#|\\\\\\s]+';
  11. var SCHEME_SIMPLE_NUMBER_RE = '(\\-|\\+)?\\d+([./]\\d+)?';
  12. var SCHEME_COMPLEX_NUMBER_RE = SCHEME_SIMPLE_NUMBER_RE + '[+\\-]' + SCHEME_SIMPLE_NUMBER_RE + 'i';
  13. var BUILTINS = {
  14. 'builtin-name':
  15. 'case-lambda call/cc class define-class exit-handler field import ' +
  16. 'inherit init-field interface let*-values let-values let/ec mixin ' +
  17. 'opt-lambda override protect provide public rename require ' +
  18. 'require-for-syntax syntax syntax-case syntax-error unit/sig unless ' +
  19. 'when with-syntax and begin call-with-current-continuation ' +
  20. 'call-with-input-file call-with-output-file case cond define ' +
  21. 'define-syntax delay do dynamic-wind else for-each if lambda let let* ' +
  22. 'let-syntax letrec letrec-syntax map or syntax-rules \' * + , ,@ - ... / ' +
  23. '; < <= = => > >= ` abs acos angle append apply asin assoc assq assv atan ' +
  24. 'boolean? caar cadr call-with-input-file call-with-output-file ' +
  25. 'call-with-values car cdddar cddddr cdr ceiling char->integer ' +
  26. 'char-alphabetic? char-ci<=? char-ci<? char-ci=? char-ci>=? char-ci>? ' +
  27. 'char-downcase char-lower-case? char-numeric? char-ready? char-upcase ' +
  28. 'char-upper-case? char-whitespace? char<=? char<? char=? char>=? char>? ' +
  29. 'char? close-input-port close-output-port complex? cons cos ' +
  30. 'current-input-port current-output-port denominator display eof-object? ' +
  31. 'eq? equal? eqv? eval even? exact->inexact exact? exp expt floor ' +
  32. 'force gcd imag-part inexact->exact inexact? input-port? integer->char ' +
  33. 'integer? interaction-environment lcm length list list->string ' +
  34. 'list->vector list-ref list-tail list? load log magnitude make-polar ' +
  35. 'make-rectangular make-string make-vector max member memq memv min ' +
  36. 'modulo negative? newline not null-environment null? number->string ' +
  37. 'number? numerator odd? open-input-file open-output-file output-port? ' +
  38. 'pair? peek-char port? positive? procedure? quasiquote quote quotient ' +
  39. 'rational? rationalize read read-char real-part real? remainder reverse ' +
  40. 'round scheme-report-environment set! set-car! set-cdr! sin sqrt string ' +
  41. 'string->list string->number string->symbol string-append string-ci<=? ' +
  42. 'string-ci<? string-ci=? string-ci>=? string-ci>? string-copy ' +
  43. 'string-fill! string-length string-ref string-set! string<=? string<? ' +
  44. 'string=? string>=? string>? string? substring symbol->string symbol? ' +
  45. 'tan transcript-off transcript-on truncate values vector ' +
  46. 'vector->list vector-fill! vector-length vector-ref vector-set! ' +
  47. 'with-input-from-file with-output-to-file write write-char zero?'
  48. };
  49. var SHEBANG = {
  50. className: 'meta',
  51. begin: '^#!',
  52. end: '$'
  53. };
  54. var LITERAL = {
  55. className: 'literal',
  56. begin: '(#t|#f|#\\\\' + SCHEME_IDENT_RE + '|#\\\\.)'
  57. };
  58. var NUMBER = {
  59. className: 'number',
  60. variants: [
  61. { begin: SCHEME_SIMPLE_NUMBER_RE, relevance: 0 },
  62. { begin: SCHEME_COMPLEX_NUMBER_RE, relevance: 0 },
  63. { begin: '#b[0-1]+(/[0-1]+)?' },
  64. { begin: '#o[0-7]+(/[0-7]+)?' },
  65. { begin: '#x[0-9a-f]+(/[0-9a-f]+)?' }
  66. ]
  67. };
  68. var STRING = hljs.QUOTE_STRING_MODE;
  69. var REGULAR_EXPRESSION = {
  70. className: 'regexp',
  71. begin: '#[pr]x"',
  72. end: '[^\\\\]"'
  73. };
  74. var COMMENT_MODES = [
  75. hljs.COMMENT(
  76. ';',
  77. '$',
  78. {
  79. relevance: 0
  80. }
  81. ),
  82. hljs.COMMENT('#\\|', '\\|#')
  83. ];
  84. var IDENT = {
  85. begin: SCHEME_IDENT_RE,
  86. relevance: 0
  87. };
  88. var QUOTED_IDENT = {
  89. className: 'symbol',
  90. begin: '\'' + SCHEME_IDENT_RE
  91. };
  92. var BODY = {
  93. endsWithParent: true,
  94. relevance: 0
  95. };
  96. var QUOTED_LIST = {
  97. begin: /'/,
  98. contains: [
  99. {
  100. begin: '\\(', end: '\\)',
  101. contains: ['self', LITERAL, STRING, NUMBER, IDENT, QUOTED_IDENT]
  102. }
  103. ]
  104. };
  105. var NAME = {
  106. className: 'name',
  107. begin: SCHEME_IDENT_RE,
  108. lexemes: SCHEME_IDENT_RE,
  109. keywords: BUILTINS
  110. };
  111. var LAMBDA = {
  112. begin: /lambda/, endsWithParent: true, returnBegin: true,
  113. contains: [
  114. NAME,
  115. {
  116. begin: /\(/, end: /\)/, endsParent: true,
  117. contains: [IDENT],
  118. }
  119. ]
  120. };
  121. var LIST = {
  122. variants: [
  123. { begin: '\\(', end: '\\)' },
  124. { begin: '\\[', end: '\\]' }
  125. ],
  126. contains: [LAMBDA, NAME, BODY]
  127. };
  128. BODY.contains = [LITERAL, NUMBER, STRING, IDENT, QUOTED_IDENT, QUOTED_LIST, LIST].concat(COMMENT_MODES);
  129. return {
  130. illegal: /\S/,
  131. contains: [SHEBANG, NUMBER, STRING, QUOTED_IDENT, QUOTED_LIST, LIST].concat(COMMENT_MODES)
  132. };
  133. }