/
scheme.js
149 lines (134 loc) · 4.99 KB
/
scheme.js
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
/*
Language: Scheme
Description: Scheme is a programming language in the Lisp family.
(keywords based on http://community.schemewiki.org/?scheme-keywords)
Author: JP Verkamp <me@jverkamp.com>
Contributors: Ivan Sagalaev <maniac@softwaremaniacs.org>
Origin: clojure.js
Website: http://community.schemewiki.org/?what-is-scheme
Category: lisp
*/
export default function(hljs) {
var SCHEME_IDENT_RE = '[^\\(\\)\\[\\]\\{\\}",\'`;#|\\\\\\s]+';
var SCHEME_SIMPLE_NUMBER_RE = '(\\-|\\+)?\\d+([./]\\d+)?';
var SCHEME_COMPLEX_NUMBER_RE = SCHEME_SIMPLE_NUMBER_RE + '[+\\-]' + SCHEME_SIMPLE_NUMBER_RE + 'i';
var BUILTINS = {
'builtin-name':
'case-lambda call/cc class define-class exit-handler field import ' +
'inherit init-field interface let*-values let-values let/ec mixin ' +
'opt-lambda override protect provide public rename require ' +
'require-for-syntax syntax syntax-case syntax-error unit/sig unless ' +
'when with-syntax and begin call-with-current-continuation ' +
'call-with-input-file call-with-output-file case cond define ' +
'define-syntax delay do dynamic-wind else for-each if lambda let let* ' +
'let-syntax letrec letrec-syntax map or syntax-rules \' * + , ,@ - ... / ' +
'; < <= = => > >= ` abs acos angle append apply asin assoc assq assv atan ' +
'boolean? caar cadr call-with-input-file call-with-output-file ' +
'call-with-values car cdddar cddddr cdr ceiling char->integer ' +
'char-alphabetic? char-ci<=? char-ci<? char-ci=? char-ci>=? char-ci>? ' +
'char-downcase char-lower-case? char-numeric? char-ready? char-upcase ' +
'char-upper-case? char-whitespace? char<=? char<? char=? char>=? char>? ' +
'char? close-input-port close-output-port complex? cons cos ' +
'current-input-port current-output-port denominator display eof-object? ' +
'eq? equal? eqv? eval even? exact->inexact exact? exp expt floor ' +
'force gcd imag-part inexact->exact inexact? input-port? integer->char ' +
'integer? interaction-environment lcm length list list->string ' +
'list->vector list-ref list-tail list? load log magnitude make-polar ' +
'make-rectangular make-string make-vector max member memq memv min ' +
'modulo negative? newline not null-environment null? number->string ' +
'number? numerator odd? open-input-file open-output-file output-port? ' +
'pair? peek-char port? positive? procedure? quasiquote quote quotient ' +
'rational? rationalize read read-char real-part real? remainder reverse ' +
'round scheme-report-environment set! set-car! set-cdr! sin sqrt string ' +
'string->list string->number string->symbol string-append string-ci<=? ' +
'string-ci<? string-ci=? string-ci>=? string-ci>? string-copy ' +
'string-fill! string-length string-ref string-set! string<=? string<? ' +
'string=? string>=? string>? string? substring symbol->string symbol? ' +
'tan transcript-off transcript-on truncate values vector ' +
'vector->list vector-fill! vector-length vector-ref vector-set! ' +
'with-input-from-file with-output-to-file write write-char zero?'
};
var LITERAL = {
className: 'literal',
begin: '(#t|#f|#\\\\' + SCHEME_IDENT_RE + '|#\\\\.)'
};
var NUMBER = {
className: 'number',
variants: [
{ begin: SCHEME_SIMPLE_NUMBER_RE, relevance: 0 },
{ begin: SCHEME_COMPLEX_NUMBER_RE, relevance: 0 },
{ begin: '#b[0-1]+(/[0-1]+)?' },
{ begin: '#o[0-7]+(/[0-7]+)?' },
{ begin: '#x[0-9a-f]+(/[0-9a-f]+)?' }
]
};
var STRING = hljs.QUOTE_STRING_MODE;
var REGULAR_EXPRESSION = {
className: 'regexp',
begin: '#[pr]x"',
end: '[^\\\\]"'
};
var COMMENT_MODES = [
hljs.COMMENT(
';',
'$',
{
relevance: 0
}
),
hljs.COMMENT('#\\|', '\\|#')
];
var IDENT = {
begin: SCHEME_IDENT_RE,
relevance: 0
};
var QUOTED_IDENT = {
className: 'symbol',
begin: '\'' + SCHEME_IDENT_RE
};
var BODY = {
endsWithParent: true,
relevance: 0
};
var QUOTED_LIST = {
variants: [
{ begin: /'/ },
{ begin: '`' }
],
contains: [
{
begin: '\\(', end: '\\)',
contains: ['self', LITERAL, STRING, NUMBER, IDENT, QUOTED_IDENT]
}
]
};
var NAME = {
className: 'name',
begin: SCHEME_IDENT_RE,
lexemes: SCHEME_IDENT_RE,
keywords: BUILTINS
};
var LAMBDA = {
begin: /lambda/, endsWithParent: true, returnBegin: true,
contains: [
NAME,
{
begin: /\(/, end: /\)/, endsParent: true,
contains: [IDENT],
}
]
};
var LIST = {
variants: [
{ begin: '\\(', end: '\\)' },
{ begin: '\\[', end: '\\]' }
],
contains: [LAMBDA, NAME, BODY]
};
BODY.contains = [LITERAL, NUMBER, STRING, IDENT, QUOTED_IDENT, QUOTED_LIST, LIST].concat(COMMENT_MODES);
return {
name: 'Scheme',
illegal: /\S/,
contains: [hljs.SHEBANG(), NUMBER, STRING, QUOTED_IDENT, QUOTED_LIST, LIST].concat(COMMENT_MODES)
};
}