123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- /*
- 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
- */
- function scheme(hljs) {
- const SCHEME_IDENT_RE = '[^\\(\\)\\[\\]\\{\\}",\'`;#|\\\\\\s]+';
- const SCHEME_SIMPLE_NUMBER_RE = '(-|\\+)?\\d+([./]\\d+)?';
- const SCHEME_COMPLEX_NUMBER_RE = SCHEME_SIMPLE_NUMBER_RE + '[+\\-]' + SCHEME_SIMPLE_NUMBER_RE + 'i';
- const KEYWORDS = {
- $pattern: SCHEME_IDENT_RE,
- '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?'
- };
- const LITERAL = {
- className: 'literal',
- begin: '(#t|#f|#\\\\' + SCHEME_IDENT_RE + '|#\\\\.)'
- };
- const 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]+)?'
- }
- ]
- };
- const STRING = hljs.QUOTE_STRING_MODE;
- const COMMENT_MODES = [
- hljs.COMMENT(
- ';',
- '$',
- {
- relevance: 0
- }
- ),
- hljs.COMMENT('#\\|', '\\|#')
- ];
- const IDENT = {
- begin: SCHEME_IDENT_RE,
- relevance: 0
- };
- const QUOTED_IDENT = {
- className: 'symbol',
- begin: '\'' + SCHEME_IDENT_RE
- };
- const BODY = {
- endsWithParent: true,
- relevance: 0
- };
- const QUOTED_LIST = {
- variants: [
- {
- begin: /'/
- },
- {
- begin: '`'
- }
- ],
- contains: [
- {
- begin: '\\(',
- end: '\\)',
- contains: [
- 'self',
- LITERAL,
- STRING,
- NUMBER,
- IDENT,
- QUOTED_IDENT
- ]
- }
- ]
- };
- const NAME = {
- className: 'name',
- relevance: 0,
- begin: SCHEME_IDENT_RE,
- keywords: KEYWORDS
- };
- const LAMBDA = {
- begin: /lambda/,
- endsWithParent: true,
- returnBegin: true,
- contains: [
- NAME,
- {
- endsParent: true,
- variants: [
- {
- begin: /\(/,
- end: /\)/
- },
- {
- begin: /\[/,
- end: /\]/
- }
- ],
- contains: [ IDENT ]
- }
- ]
- };
- const 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)
- };
- }
- module.exports = scheme;
|