annotate .cms/lib/codemirror/mode/apl/apl.js @ 0:78edf6b517a0 draft

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