136 lines
7.7 KiB
JavaScript
136 lines
7.7 KiB
JavaScript
const e=Object.freeze({displayName:"Scheme",fileTypes:["scm","ss","sch","rkt"],name:"scheme",patterns:[{include:"#comment"},{include:"#block-comment"},{include:"#sexp"},{include:"#string"},{include:"#language-functions"},{include:"#quote"},{include:"#illegal"}],repository:{"block-comment":{begin:"\\#\\|",contentName:"comment",end:"\\|\\#",name:"comment",patterns:[{include:"#block-comment",name:"comment"}]},comment:{begin:"(^[ \\t]+)?(?=;)",beginCaptures:{1:{name:"punctuation.whitespace.comment.leading.scheme"}},end:"(?!\\G)",patterns:[{begin:";",beginCaptures:{0:{name:"punctuation.definition.comment.scheme"}},end:"\\n",name:"comment.line.semicolon.scheme"}]},constants:{patterns:[{match:"#[t|f]",name:"constant.language.boolean.scheme"},{match:`(?<=[\\(\\s])((#e|#i)?[0-9]+(\\.[0-9]+)?|(#x)[0-9a-fA-F]+|(#o)[0-7]+|(#b)[01]+)(?=[\\s;()'",\\[\\]])`,name:"constant.numeric.scheme"}]},illegal:{match:"[()\\[\\]]",name:"invalid.illegal.parenthesis.scheme"},"language-functions":{patterns:[{match:`(?x)
|
|
(?<=(\\s|\\(|\\[))
|
|
( do|or|and|else|quasiquote|begin|if|case|set!|
|
|
cond|let|unquote|define|let\\*|unquote-splicing|delay|
|
|
letrec)
|
|
(?=(\\s|\\())`,name:"keyword.control.scheme"},{comment:`
|
|
These functions run a test, and return a boolean
|
|
answer.
|
|
`,match:`(?x)
|
|
(?<=(\\s|\\())
|
|
( char-alphabetic|char-lower-case|char-numeric|
|
|
char-ready|char-upper-case|char-whitespace|
|
|
(?:char|string)(?:-ci)?(?:=|<=?|>=?)|
|
|
atom|boolean|bound-identifier=|char|complex|
|
|
identifier|integer|symbol|free-identifier=|inexact|
|
|
eof-object|exact|list|(?:input|output)-port|pair|
|
|
real|rational|zero|vector|negative|odd|null|string|
|
|
eq|equal|eqv|even|number|positive|procedure
|
|
)
|
|
(\\?)
|
|
(?=(\\s|\\())
|
|
`,name:"support.function.boolean-test.scheme"},{comment:`
|
|
These functions change one type into another.
|
|
`,match:`(?x)
|
|
(?<=(\\s|\\())
|
|
( char->integer|exact->inexact|inexact->exact|
|
|
integer->char|symbol->string|list->vector|
|
|
list->string|identifier->symbol|vector->list|
|
|
string->list|string->number|string->symbol|
|
|
number->string
|
|
)
|
|
(?=(\\s|\\())
|
|
`,name:"support.function.convert-type.scheme"},{comment:`
|
|
These functions are potentially dangerous because
|
|
they have side-effects which could affect other
|
|
parts of the program.
|
|
`,match:`(?x)
|
|
(?<=(\\s|\\())
|
|
( set-(?:car|cdr)|
|
|
(?:vector|string)-(?:fill|set)
|
|
)
|
|
(!)
|
|
(?=(\\s|\\())
|
|
`,name:"support.function.with-side-effects.scheme"},{comment:`
|
|
+, -, *, /, =, >, etc.
|
|
`,match:`(?x)
|
|
(?<=(\\s|\\())
|
|
( >=?|<=?|=|[*/+-])
|
|
(?=(\\s|\\())
|
|
`,name:"keyword.operator.arithmetic.scheme"},{match:`(?x)
|
|
(?<=(\\s|\\())
|
|
( append|apply|approximate|
|
|
call-with-current-continuation|call/cc|catch|
|
|
construct-identifier|define-syntax|display|foo|
|
|
for-each|force|format|cd|gen-counter|gen-loser|
|
|
generate-identifier|last-pair|length|let-syntax|
|
|
letrec-syntax|list|list-ref|list-tail|load|log|
|
|
macro|magnitude|map|map-streams|max|member|memq|
|
|
memv|min|newline|nil|not|peek-char|rationalize|
|
|
read|read-char|return|reverse|sequence|substring|
|
|
syntax|syntax-rules|transcript-off|transcript-on|
|
|
truncate|unwrap-syntax|values-list|write|write-char|
|
|
|
|
|
|
cons|c(a|d){1,4}r|
|
|
|
|
|
|
abs|acos|angle|asin|assoc|assq|assv|atan|ceiling|
|
|
cos|floor|round|sin|sqrt|tan|
|
|
(?:real|imag)-part|numerator|denominator
|
|
|
|
|
|
modulo|exp|expt|remainder|quotient|lcm|
|
|
|
|
|
|
call-with-(?:input|output)-file|
|
|
(?:close|current)-(?:input|output)-port|
|
|
with-(?:input|output)-from-file|
|
|
open-(?:input|output)-file|
|
|
|
|
|
|
char-(?:downcase|upcase|ready)|
|
|
|
|
|
|
make-(?:polar|promise|rectangular|string|vector)
|
|
|
|
|
|
string(?:-(?:append|copy|length|ref))?|
|
|
vector(?:-length|-ref)
|
|
)
|
|
(?=(\\s|\\())
|
|
`,name:"support.function.general.scheme"}]},quote:{comment:`
|
|
We need to be able to quote any kind of item, which creates
|
|
a tiny bit of complexity in our grammar. It is hopefully
|
|
not overwhelming complexity.
|
|
|
|
Note: the first two matches are special cases. quoted
|
|
symbols, and quoted empty lists are considered constant.other
|
|
|
|
`,patterns:[{captures:{1:{name:"punctuation.section.quoted.symbol.scheme"}},match:`(?x)
|
|
(')\\s*
|
|
([[:alnum:]][[:alnum:]!$%&*+-./:<=>?@^_~]*)
|
|
`,name:"constant.other.symbol.scheme"},{captures:{1:{name:"punctuation.section.quoted.empty-list.scheme"},2:{name:"meta.expression.scheme"},3:{name:"punctuation.section.expression.begin.scheme"},4:{name:"punctuation.section.expression.end.scheme"}},match:`(?x)
|
|
(')\\s*
|
|
((\\()\\s*(\\)))
|
|
`,name:"constant.other.empty-list.schem"},{begin:"(')\\s*",beginCaptures:{1:{name:"punctuation.section.quoted.scheme"}},comment:"quoted double-quoted string or s-expression",end:"(?=[\\s()])|(?<=\\n)",name:"string.other.quoted-object.scheme",patterns:[{include:"#quoted"}]}]},"quote-sexp":{begin:"(?<=\\()\\s*(quote)\\s+",beginCaptures:{1:{name:"keyword.control.quote.scheme"}},comment:`
|
|
Something quoted with (quote «thing»). In this case «thing»
|
|
will not be evaluated, so we are considering it a string.
|
|
`,contentName:"string.other.quote.scheme",end:"(?=[\\s)])|(?<=\\n)",patterns:[{include:"#quoted"}]},quoted:{patterns:[{include:"#string"},{begin:"(\\()",beginCaptures:{1:{name:"punctuation.section.expression.begin.scheme"}},end:"(\\))",endCaptures:{1:{name:"punctuation.section.expression.end.scheme"}},name:"meta.expression.scheme",patterns:[{include:"#quoted"}]},{include:"#quote"},{include:"#illegal"}]},sexp:{begin:"(\\()",beginCaptures:{1:{name:"punctuation.section.expression.begin.scheme"}},end:"(\\))(\\n)?",endCaptures:{1:{name:"punctuation.section.expression.end.scheme"},2:{name:"meta.after-expression.scheme"}},name:"meta.expression.scheme",patterns:[{include:"#comment"},{begin:`(?x)
|
|
(?<=\\()
|
|
(define)\\s+
|
|
(\\()
|
|
([[:alnum:]][[:alnum:]!$%&*+-./:<=>?@^_~]*)
|
|
((\\s+
|
|
([[:alnum:]][[:alnum:]!$%&*+-./:<=>?@^_~]*|[._])
|
|
)*
|
|
)\\s*
|
|
(\\))
|
|
`,captures:{1:{name:"keyword.control.scheme"},2:{name:"punctuation.definition.function.scheme"},3:{name:"entity.name.function.scheme"},4:{name:"variable.parameter.function.scheme"},7:{name:"punctuation.definition.function.scheme"}},end:"(?=\\))",name:"meta.declaration.procedure.scheme",patterns:[{include:"#comment"},{include:"#sexp"},{include:"#illegal"}]},{begin:`(?x)
|
|
(?<=\\()
|
|
(lambda)\\s+
|
|
(\\()
|
|
((?:
|
|
([[:alnum:]][[:alnum:]!$%&*+-./:<=>?@^_~]*|[._])
|
|
\\s+
|
|
)*(?:
|
|
([[:alnum:]][[:alnum:]!$%&*+-./:<=>?@^_~]*|[._])
|
|
)?)
|
|
(\\))
|
|
`,captures:{1:{name:"keyword.control.scheme"},2:{name:"punctuation.definition.variable.scheme"},3:{name:"variable.parameter.scheme"},6:{name:"punctuation.definition.variable.scheme"}},comment:`
|
|
Not sure this one is quite correct. That \\s* is
|
|
particularly troubling
|
|
`,end:"(?=\\))",name:"meta.declaration.procedure.scheme",patterns:[{include:"#comment"},{include:"#sexp"},{include:"#illegal"}]},{begin:"(?<=\\()(define)\\s([[:alnum:]][[:alnum:]!$%&*+-./:<=>?@^_~]*)\\s*.*?",captures:{1:{name:"keyword.control.scheme"},2:{name:"variable.other.scheme"}},end:"(?=\\))",name:"meta.declaration.variable.scheme",patterns:[{include:"#comment"},{include:"#sexp"},{include:"#illegal"}]},{include:"#quote-sexp"},{include:"#quote"},{include:"#language-functions"},{include:"#string"},{include:"#constants"},{match:"(?<=[\\(\\s])(#\\\\)(space|newline|tab)(?=[\\s\\)])",name:"constant.character.named.scheme"},{match:"(?<=[\\(\\s])(#\\\\)x[0-9A-F]{2,4}(?=[\\s\\)])",name:"constant.character.hex-literal.scheme"},{match:"(?<=[\\(\\s])(#\\\\).(?=[\\s\\)])",name:"constant.character.escape.scheme"},{comment:`
|
|
the . in (a . b) which conses together two elements
|
|
a and b. (a b c) == (a . (b . (c . nil)))
|
|
`,match:"(?<=[ ()])\\.(?=[ ()])",name:"punctuation.separator.cons.scheme"},{include:"#sexp"},{include:"#illegal"}]},string:{begin:'(")',beginCaptures:{1:{name:"punctuation.definition.string.begin.scheme"}},end:'(")',endCaptures:{1:{name:"punctuation.definition.string.end.scheme"}},name:"string.quoted.double.scheme",patterns:[{match:"\\\\.",name:"constant.character.escape.scheme"}]}},scopeName:"source.scheme"});var n=[e];export{n as default};
|