openrat-cms

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

apl.js (4736B)


      1 // CodeMirror, copyright (c) by Marijn Haverbeke and others
      2 // Distributed under an MIT license: http://codemirror.net/LICENSE
      3 
      4 (function(mod) {
      5   if (typeof exports == "object" && typeof module == "object") // CommonJS
      6     mod(require("../../lib/codemirror"));
      7   else if (typeof define == "function" && define.amd) // AMD
      8     define(["../../lib/codemirror"], mod);
      9   else // Plain browser env
     10     mod(CodeMirror);
     11 })(function(CodeMirror) {
     12 "use strict";
     13 
     14 CodeMirror.defineMode("apl", function() {
     15   var builtInOps = {
     16     ".": "innerProduct",
     17     "\\": "scan",
     18     "/": "reduce",
     19     "⌿": "reduce1Axis",
     20     "⍀": "scan1Axis",
     21     "¨": "each",
     22     "⍣": "power"
     23   };
     24   var builtInFuncs = {
     25     "+": ["conjugate", "add"],
     26     "−": ["negate", "subtract"],
     27     "×": ["signOf", "multiply"],
     28     "÷": ["reciprocal", "divide"],
     29     "⌈": ["ceiling", "greaterOf"],
     30     "⌊": ["floor", "lesserOf"],
     31     "∣": ["absolute", "residue"],
     32     "⍳": ["indexGenerate", "indexOf"],
     33     "?": ["roll", "deal"],
     34     "⋆": ["exponentiate", "toThePowerOf"],
     35     "⍟": ["naturalLog", "logToTheBase"],
     36     "○": ["piTimes", "circularFuncs"],
     37     "!": ["factorial", "binomial"],
     38     "⌹": ["matrixInverse", "matrixDivide"],
     39     "<": [null, "lessThan"],
     40     "≤": [null, "lessThanOrEqual"],
     41     "=": [null, "equals"],
     42     ">": [null, "greaterThan"],
     43     "≥": [null, "greaterThanOrEqual"],
     44     "≠": [null, "notEqual"],
     45     "≡": ["depth", "match"],
     46     "≢": [null, "notMatch"],
     47     "∈": ["enlist", "membership"],
     48     "⍷": [null, "find"],
     49     "∪": ["unique", "union"],
     50     "∩": [null, "intersection"],
     51     "∼": ["not", "without"],
     52     "∨": [null, "or"],
     53     "∧": [null, "and"],
     54     "⍱": [null, "nor"],
     55     "⍲": [null, "nand"],
     56     "⍴": ["shapeOf", "reshape"],
     57     ",": ["ravel", "catenate"],
     58     "⍪": [null, "firstAxisCatenate"],
     59     "⌽": ["reverse", "rotate"],
     60     "⊖": ["axis1Reverse", "axis1Rotate"],
     61     "⍉": ["transpose", null],
     62     "↑": ["first", "take"],
     63     "↓": [null, "drop"],
     64     "⊂": ["enclose", "partitionWithAxis"],
     65     "⊃": ["diclose", "pick"],
     66     "⌷": [null, "index"],
     67     "⍋": ["gradeUp", null],
     68     "⍒": ["gradeDown", null],
     69     "⊤": ["encode", null],
     70     "⊥": ["decode", null],
     71     "⍕": ["format", "formatByExample"],
     72     "⍎": ["execute", null],
     73     "⊣": ["stop", "left"],
     74     "⊢": ["pass", "right"]
     75   };
     76 
     77   var isOperator = /[\.\/⌿⍀¨⍣]/;
     78   var isNiladic = /⍬/;
     79   var isFunction = /[\+−×÷⌈⌊∣⍳\?⋆⍟○!⌹<≤=>≥≠≡≢∈⍷∪∩∼∨∧⍱⍲⍴,⍪⌽⊖⍉↑↓⊂⊃⌷⍋⍒⊤⊥⍕⍎⊣⊢]/;
     80   var isArrow = /←/;
     81   var isComment = /[⍝#].*$/;
     82 
     83   var stringEater = function(type) {
     84     var prev;
     85     prev = false;
     86     return function(c) {
     87       prev = c;
     88       if (c === type) {
     89         return prev === "\\";
     90       }
     91       return true;
     92     };
     93   };
     94   return {
     95     startState: function() {
     96       return {
     97         prev: false,
     98         func: false,
     99         op: false,
    100         string: false,
    101         escape: false
    102       };
    103     },
    104     token: function(stream, state) {
    105       var ch, funcName;
    106       if (stream.eatSpace()) {
    107         return null;
    108       }
    109       ch = stream.next();
    110       if (ch === '"' || ch === "'") {
    111         stream.eatWhile(stringEater(ch));
    112         stream.next();
    113         state.prev = true;
    114         return "string";
    115       }
    116       if (/[\[{\(]/.test(ch)) {
    117         state.prev = false;
    118         return null;
    119       }
    120       if (/[\]}\)]/.test(ch)) {
    121         state.prev = true;
    122         return null;
    123       }
    124       if (isNiladic.test(ch)) {
    125         state.prev = false;
    126         return "niladic";
    127       }
    128       if (/[¯\d]/.test(ch)) {
    129         if (state.func) {
    130           state.func = false;
    131           state.prev = false;
    132         } else {
    133           state.prev = true;
    134         }
    135         stream.eatWhile(/[\w\.]/);
    136         return "number";
    137       }
    138       if (isOperator.test(ch)) {
    139         return "operator apl-" + builtInOps[ch];
    140       }
    141       if (isArrow.test(ch)) {
    142         return "apl-arrow";
    143       }
    144       if (isFunction.test(ch)) {
    145         funcName = "apl-";
    146         if (builtInFuncs[ch] != null) {
    147           if (state.prev) {
    148             funcName += builtInFuncs[ch][1];
    149           } else {
    150             funcName += builtInFuncs[ch][0];
    151           }
    152         }
    153         state.func = true;
    154         state.prev = false;
    155         return "function " + funcName;
    156       }
    157       if (isComment.test(ch)) {
    158         stream.skipToEnd();
    159         return "comment";
    160       }
    161       if (ch === "∘" && stream.peek() === ".") {
    162         stream.next();
    163         return "function jot-dot";
    164       }
    165       stream.eatWhile(/[\w\$_]/);
    166       state.prev = true;
    167       return "keyword";
    168     }
    169   };
    170 });
    171 
    172 CodeMirror.defineMIME("text/apl", "apl");
    173 
    174 });