| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 | /*Language: SchemeDescription: 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.jsWebsite: http://community.schemewiki.org/?what-is-schemeCategory: 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;
 |