septima-lang 0.0.5 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/main.js +1 -0
  2. package/package.json +3 -3
  3. package/dist/src/ast-node.d.ts +0 -98
  4. package/dist/src/ast-node.js +0 -139
  5. package/dist/src/extract-message.d.ts +0 -1
  6. package/dist/src/extract-message.js +0 -10
  7. package/dist/src/fail-me.d.ts +0 -1
  8. package/dist/src/fail-me.js +0 -11
  9. package/dist/src/find-array-method.d.ts +0 -15
  10. package/dist/src/find-array-method.js +0 -104
  11. package/dist/src/find-string-method.d.ts +0 -2
  12. package/dist/src/find-string-method.js +0 -88
  13. package/dist/src/index.d.ts +0 -1
  14. package/dist/src/index.js +0 -18
  15. package/dist/src/location.d.ts +0 -11
  16. package/dist/src/location.js +0 -3
  17. package/dist/src/parser.d.ts +0 -44
  18. package/dist/src/parser.js +0 -458
  19. package/dist/src/result.d.ts +0 -24
  20. package/dist/src/result.js +0 -29
  21. package/dist/src/runtime.d.ts +0 -27
  22. package/dist/src/runtime.js +0 -343
  23. package/dist/src/scanner.d.ts +0 -23
  24. package/dist/src/scanner.js +0 -88
  25. package/dist/src/septima.d.ts +0 -32
  26. package/dist/src/septima.js +0 -91
  27. package/dist/src/should-never-happen.d.ts +0 -1
  28. package/dist/src/should-never-happen.js +0 -9
  29. package/dist/src/source-code.d.ts +0 -19
  30. package/dist/src/source-code.js +0 -90
  31. package/dist/src/stack.d.ts +0 -11
  32. package/dist/src/stack.js +0 -19
  33. package/dist/src/switch-on.d.ts +0 -1
  34. package/dist/src/switch-on.js +0 -9
  35. package/dist/src/symbol-table.d.ts +0 -6
  36. package/dist/src/symbol-table.js +0 -3
  37. package/dist/src/value.d.ts +0 -128
  38. package/dist/src/value.js +0 -634
  39. package/dist/tests/parser.spec.d.ts +0 -1
  40. package/dist/tests/parser.spec.js +0 -31
  41. package/dist/tests/septima-compute-module.spec.d.ts +0 -1
  42. package/dist/tests/septima-compute-module.spec.js +0 -30
  43. package/dist/tests/septima.spec.d.ts +0 -1
  44. package/dist/tests/septima.spec.js +0 -774
  45. package/dist/tests/value.spec.d.ts +0 -1
  46. package/dist/tests/value.spec.js +0 -355
  47. package/dist/tsconfig.tsbuildinfo +0 -1
  48. package/jest-output.json +0 -1
  49. package/src/a.js +0 -66
  50. package/src/ast-node.ts +0 -249
  51. package/src/extract-message.ts +0 -5
  52. package/src/fail-me.ts +0 -7
  53. package/src/find-array-method.ts +0 -115
  54. package/src/find-string-method.ts +0 -84
  55. package/src/index.ts +0 -1
  56. package/src/location.ts +0 -13
  57. package/src/parser.ts +0 -526
  58. package/src/result.ts +0 -45
  59. package/src/runtime.ts +0 -360
  60. package/src/scanner.ts +0 -106
  61. package/src/septima.ts +0 -114
  62. package/src/should-never-happen.ts +0 -4
  63. package/src/source-code.ts +0 -101
  64. package/src/stack.ts +0 -18
  65. package/src/switch-on.ts +0 -4
  66. package/src/symbol-table.ts +0 -7
  67. package/src/value.ts +0 -742
  68. package/tests/parser.spec.ts +0 -30
  69. package/tests/septima-compute-module.spec.ts +0 -33
  70. package/tests/septima.spec.ts +0 -839
  71. package/tests/value.spec.ts +0 -387
  72. package/tsconfig.json +0 -11
@@ -1,90 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SourceCode = void 0;
4
- const ast_node_1 = require("./ast-node");
5
- class SourceCode {
6
- constructor(input) {
7
- this.input = input;
8
- }
9
- formatTrace(trace) {
10
- const spacer = ' ';
11
- const formatted = trace
12
- .map(ast => this.sourceRef((0, ast_node_1.span)(ast)))
13
- .reverse()
14
- .join(`\n${spacer}`);
15
- return `${spacer}${formatted}`;
16
- }
17
- sourceRefOfLocation(loc) {
18
- return this.sourceRef(this.expandToEndOfLine(loc));
19
- }
20
- sourceRef(span) {
21
- if (!span) {
22
- return `at <unknown location>`;
23
- }
24
- return `at ${this.formatSpan(span)} ${this.interestingPart(span)}`;
25
- }
26
- formatSpan(span) {
27
- const f = this.resolveLocation(span.from);
28
- const t = this.resolveLocation(span.to);
29
- if (f.line === t.line) {
30
- return `(${f.line + 1}:${f.col + 1}..${t.col + 1})`;
31
- }
32
- return `(${f.line + 1}:${f.col + 1}..${t.line + 1}:${t.col + 1})`;
33
- }
34
- interestingPart(span) {
35
- const f = this.resolveLocation(span.from);
36
- const t = this.resolveLocation(span.to);
37
- const strip = (s) => s.replace(/^[\n]*/, '').replace(/[\n]*$/, '');
38
- const limit = 80;
39
- const lineAtFrom = this.lineAt(span.from);
40
- if (f.line !== t.line) {
41
- return `${strip(lineAtFrom).substring(0, limit)}...`;
42
- }
43
- const stripped = strip(lineAtFrom.substring(f.col, t.col + 1));
44
- if (stripped.length <= limit) {
45
- return stripped;
46
- }
47
- return `${stripped.substring(0, limit)}...`;
48
- }
49
- resolveLocation(loc) {
50
- const prefix = this.input.slice(0, loc.offset);
51
- let line = 0;
52
- for (let i = 0; i < prefix.length; ++i) {
53
- const ch = prefix[i];
54
- if (ch === '\n') {
55
- line += 1;
56
- }
57
- }
58
- let col = 0;
59
- for (let i = prefix.length - 1; i >= 0; --i, ++col) {
60
- const ch = prefix[i];
61
- if (ch === '\n') {
62
- break;
63
- }
64
- }
65
- return { line, col };
66
- }
67
- /**
68
- * Returns a span starting a the given input location that runs all the way to the end of the line. Specifically, the
69
- * returned span's `.to` location will point at the character (in the same line as `loc`) that is immediately before
70
- * the terminating newline character.
71
- */
72
- expandToEndOfLine(loc) {
73
- let endOfLine = this.input.indexOf('\n', loc.offset);
74
- if (endOfLine < 0) {
75
- endOfLine = this.input.length - 1;
76
- }
77
- return { from: loc, to: { offset: endOfLine } };
78
- }
79
- lineAt(loc) {
80
- const precedingNewline = this.input.lastIndexOf('\n', loc.offset);
81
- // add a + 1 to skip over the '\n' character (it is not part of the line). Also works if precedingNewLine is -1 (no
82
- // preceding newline exists)
83
- const startOfLine = precedingNewline + 1;
84
- const endOfLine = this.expandToEndOfLine(loc).to;
85
- const ret = this.input.substring(startOfLine, endOfLine.offset + 1);
86
- return ret;
87
- }
88
- }
89
- exports.SourceCode = SourceCode;
90
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlLWNvZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc291cmNlLWNvZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUNBQTBDO0FBRzFDLE1BQWEsVUFBVTtJQUNyQixZQUFxQixLQUFhO1FBQWIsVUFBSyxHQUFMLEtBQUssQ0FBUTtJQUFHLENBQUM7SUFFdEMsV0FBVyxDQUFDLEtBQWdCO1FBQzFCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQTtRQUVuQixNQUFNLFNBQVMsR0FBRyxLQUFLO2FBQ3BCLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBQSxlQUFJLEVBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUNyQyxPQUFPLEVBQUU7YUFDVCxJQUFJLENBQUMsS0FBSyxNQUFNLEVBQUUsQ0FBQyxDQUFBO1FBQ3RCLE9BQU8sR0FBRyxNQUFNLEdBQUcsU0FBUyxFQUFFLENBQUE7SUFDaEMsQ0FBQztJQUVELG1CQUFtQixDQUFDLEdBQWE7UUFDL0IsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO0lBQ3BELENBQUM7SUFFRCxTQUFTLENBQUMsSUFBc0I7UUFDOUIsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNULE9BQU8sdUJBQXVCLENBQUE7U0FDL0I7UUFDRCxPQUFPLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUE7SUFDcEUsQ0FBQztJQUVELFVBQVUsQ0FBQyxJQUFVO1FBQ25CLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3pDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUs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
@@ -1,11 +0,0 @@
1
- import { AstNode } from './ast-node';
2
- export declare type T = {
3
- ast: AstNode;
4
- next: T;
5
- } | undefined;
6
- export declare function push(ast: AstNode, s: T): {
7
- ast: AstNode;
8
- next: T;
9
- };
10
- export declare function pop(s: T): T;
11
- export declare function empty(): T;
package/dist/src/stack.js DELETED
@@ -1,19 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.empty = exports.pop = exports.push = void 0;
4
- function push(ast, s) {
5
- return { ast, next: s };
6
- }
7
- exports.push = push;
8
- function pop(s) {
9
- if (typeof s === 'undefined') {
10
- throw new Error(`Cannot pop from an empty stack`);
11
- }
12
- return s.next;
13
- }
14
- exports.pop = pop;
15
- function empty() {
16
- return undefined;
17
- }
18
- exports.empty = empty;
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBR0EsU0FBZ0IsSUFBSSxDQUFDLEdBQVksRUFBRSxDQUFJO0lBQ3JDLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFBO0FBQ3pCLENBQUM7QUFGRCxvQkFFQztBQUVELFNBQWdCLEdBQUcsQ0FBQyxDQUFJO0lBQ3RCLElBQUksT0FBTyxDQUFDLEtBQUssV0FBVyxFQUFFO1FBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQTtLQUNsRDtJQUVELE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQTtBQUNmLENBQUM7QUFORCxrQkFNQztBQUVELFNBQWdCLEtBQUs7SUFDbkIsT0FBTyxTQUFTLENBQUE7QUFDbEIsQ0FBQztBQUZELHNCQUVDIn0=
@@ -1 +0,0 @@
1
- export declare function switchOn<G, K extends string>(selector: K, cases: Record<K, () => G>): G;
@@ -1,9 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.switchOn = void 0;
4
- function switchOn(selector, cases) {
5
- const f = cases[selector];
6
- return f();
7
- }
8
- exports.switchOn = switchOn;
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dpdGNoLW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N3aXRjaC1vbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxTQUFnQixRQUFRLENBQXNCLFFBQVcsRUFBRSxLQUF5QjtJQUNsRixNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDekIsT0FBTyxDQUFDLEVBQUUsQ0FBQTtBQUNaLENBQUM7QUFIRCw0QkFHQyJ9
@@ -1,6 +0,0 @@
1
- import { Value } from './value';
2
- export interface SymbolTable {
3
- lookup(sym: string): Value;
4
- export(): Record<string, unknown>;
5
- exportValue(): Record<string, Value>;
6
- }
@@ -1,3 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ltYm9sLXRhYmxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N5bWJvbC10YWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
@@ -1,128 +0,0 @@
1
- import { AstNode, Lambda } from './ast-node';
2
- import { CallEvaluator } from './find-array-method';
3
- import { Span } from './location';
4
- import * as Stack from './stack';
5
- import { SymbolTable } from './symbol-table';
6
- declare type LambdaEvaluator = (names: string[], ast: AstNode, table: SymbolTable) => Value;
7
- declare type Inner = {
8
- tag: 'arr';
9
- val: Value[];
10
- } | {
11
- tag: 'bool';
12
- val: boolean;
13
- } | {
14
- tag: 'foreign';
15
- val: (...args: Value[]) => unknown;
16
- } | {
17
- tag: 'lambda';
18
- val: {
19
- ast: Lambda;
20
- table: SymbolTable;
21
- };
22
- } | {
23
- tag: 'num';
24
- val: number;
25
- } | {
26
- tag: 'obj';
27
- val: Record<string, Value>;
28
- } | {
29
- tag: 'sink';
30
- val: undefined;
31
- span?: Span;
32
- trace?: Stack.T;
33
- symbols?: SymbolTable;
34
- } | {
35
- tag: 'str';
36
- val: string;
37
- };
38
- export declare class Value {
39
- readonly inner: Inner;
40
- private constructor();
41
- static bool(val: boolean): Value;
42
- static num(val: number): Value;
43
- /**
44
- * Returns a Value which is essentially a "sink": (almost) every computation involving a sink evaluates to sink. A few
45
- * quick examples: `5+sink`, `sink.x`, `sink()`, `Object.keys(sink)`, `if (sink) 4 else 8` all evaluate to `sink`. The
46
- * raitonale is that once an expression evaluates to `sink` all expressions depending on it also evaluate to `sink`.
47
- *
48
- * There are however a few (intentional) exemptions:
49
- * (i) a sink can be passed as an actual parameter in a function call. Hence `(fun (x,y) y)(sink, 5)` will evaluate
50
- * to `5`.
51
- * (ii) a sink can be compared with itself.
52
- * (iii) in `if()` expressions, only one of the branches is evlauated (based on the condition's value). As a result,
53
- * evluation of a sink-producing branch can be skipping. Specifically, `if (true) 5 else sink` evaluates to `5`.
54
- * (iv) in `||` and `&&` expressions, the evaluation of the right hand side can be skipped. Specifically,
55
- * `true || sink` evaluates to `true` and `false && sink` evaluates to `false`.
56
- */
57
- static sink(span?: Span, trace?: Stack.T, symbols?: SymbolTable): Value;
58
- static str(val: string): Value;
59
- static arr(val: Value[]): Value;
60
- static obj(val: Record<string, Value>): Value;
61
- static lambda(ast: Lambda, table: SymbolTable): Value;
62
- static foreign(f: (...args: Value[]) => unknown): Value;
63
- isSink(): boolean;
64
- unwrap(): unknown;
65
- assertBool(): boolean;
66
- assertNum(): number;
67
- assertStr(): string;
68
- assertArr(): Value[];
69
- assertObj(): Record<string, Value>;
70
- assertLambda(): {
71
- ast: Lambda;
72
- table: SymbolTable;
73
- };
74
- isLambda(): boolean;
75
- ifElse(positive: () => Value, negative: () => Value): Value;
76
- bindToSpan(span: Span): Value;
77
- trace(): AstNode[] | undefined;
78
- symbols(): SymbolTable | undefined;
79
- span(): Span | undefined;
80
- or(that: () => Value): Value;
81
- and(that: () => Value): Value;
82
- unsink(that: () => Value): Value;
83
- equalsTo(that: Value): Value;
84
- not(): Value;
85
- private binaryNumericOperator;
86
- plus(that: Value): Value;
87
- minus(that: Value): Value;
88
- times(that: Value): Value;
89
- power(that: Value): Value;
90
- over(that: Value): Value;
91
- modulo(that: Value): Value;
92
- negate(): Value;
93
- isToZero(comparator: '<' | '<=' | '==' | '!=' | '>=' | '>'): Value;
94
- isTrue(): boolean;
95
- isZero(): boolean;
96
- /**
97
- * Determines the order beteween `this` and the given argument (`that`). The behavior of this method is dictated by
98
- * the following principles:
99
- *
100
- * (i) if a < b then b >= a (i.e., it provides a consistent answer regardless of the whether `this` is `a`
101
- * and `that` is `b` or vice versa)
102
- * (ii) ordering two values of different type result in runtime error.
103
- * (iii) orderingg a value with itself evaluates to `0`
104
- *
105
- * Principles (i) and (iii) realizes the intuitive behavior of comparisons. (ii) realizes the idea that
106
- * "one cannot compare oranges and apples". This is essentially a design decision. We could have gone with defining
107
- * some order between types (the tag of a Value object), but we feel that a saner approach is to say "we do not know
108
- * how to sort an array containing numbers and booleans".
109
- *
110
- * IMPORTANT: these principles overpower other principles. In parituclar, the principles that "an expression with
111
- * sink evaluates to sink" is trumped by comparison principle (ii)
112
- *
113
- * @param that
114
- * @returns
115
- */
116
- order(that: Value): Value;
117
- static toStringOrNumber(input: string | Value): string | number;
118
- access(indexValue: string | Value, callEvaluator: CallEvaluator): Value;
119
- call(args: Value[], evaluator: LambdaEvaluator): Value;
120
- keys(): Value;
121
- entries(): Value;
122
- fromEntries(): Value;
123
- toString(): string;
124
- toJSON(): unknown;
125
- export(): unknown;
126
- static from(u: unknown): Value;
127
- }
128
- export {};