Skip to content

Commit 2784e92

Browse files
author
Lingdong Huang
committed
static type inference
1 parent e3f7a86 commit 2784e92

File tree

12 files changed

+707
-25
lines changed

12 files changed

+707
-25
lines changed

examples/collatz.wy

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,16 @@
66
欲行是術。必先得一數。
77
曰「乙」。
88
乃行是術曰。
9+
吾有一數。名之曰「埃」。
910
除「乙」以二。所餘幾何。名之曰「積」。
10-
若「積」不等於零者。乘三以「乙」,名之曰「埃」。加一以「埃」,名之曰「埃」
11-
若非 除二於「乙」。名之曰「埃」
11+
若「積」不等於零者。乘三以「乙」。加其於一。昔之「埃」者。今其是矣
12+
若非 除二於「乙」。昔之「埃」者。今其是矣。云云
1213
乃得「埃」。
1314
是謂「助手」之術也。
1415

1516
吾有一列。名之曰「回」。充「回」以「甲」。
1617
恆為是。
17-
若「甲」等於一者乃止。也。
18+
若「甲」等於一者乃止。也。
1819
施「助手」於「甲」。昔之「甲」者。今其是矣。
1920
充「回」以「甲」。
2021
云云。

examples/modinv.wy

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,8 @@
55

66
有數一。名之曰「天元」。
77

8-
昔之「右上」者。今「奇數」是矣。
9-
昔之「右下」者。今「定母」是矣。
10-
昔之「左上」者。今「天元」是矣。
11-
昔之「左下」者。今零是矣。
8+
吾有四數。曰「奇數」曰「定母」曰「天元」曰零。
9+
名之曰「右上」曰「右下」曰「左上」曰「左下」。
1210

1311
恆為是。
1412
若「右上」等於一者。乃得「左上」也。

examples/nested_fun.wy

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,17 @@
44
吾有一列。名之曰「癸」。充「癸」以一以二以三。
55

66
吾有一術。名之曰「丁」。欲行是術。必先得三數。曰「寅」曰「卯」曰「辰」乃行是術曰。
7+
乃得一。
78
是謂「丁」之術也。
89

910
吾有一術。名之曰「戊」。欲行是術。必先得二數。曰「寅」曰「卯」乃行是術曰。
11+
乃得二。
1012
是謂「戊」之術也。
1113

1214
吾有一術。名之曰「己」。欲行是術。必先得一數。曰「寅」乃行是術曰。
15+
乃得三。
1316
是謂「己」之術也。
1417

15-
1618
注曰「「庚 = 戊(甲,乙)」」
1719
夫「甲」。夫「乙」。取二以施「戊」。名之曰「庚」。
1820

examples/sieve.wy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
加一以「戊」。昔之「戊」者。今其是矣云云。
1414

1515
吾有一列。名之曰「諸素」。
16-
有數二。名之曰「戊」。恆為是。若「戊」等於「掩」之長者乃止也。
16+
昔之「戊」者。今二是矣。恆為是。若「戊」等於「掩」之長者乃止也。
1717
夫「掩」之「戊」。名之曰「素耶」。
1818
若「素耶」者充「諸素」以「戊」也。
1919
加一以「戊」。昔之「戊」者。今其是矣云云。

lib/js/畫譜.wy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
今有一術。名之曰「運筆」。欲行是術。必先得一物。曰「紙」。二數。曰「東」曰「南」。乃行是術曰。
4040
有物「紙」。名之曰「canv」。施「canv.getContext」於「「2d」」。名之曰「ctx」。
4141
施「(x=>y=>ctx.lineTo(x,y))」於「東」於「南」。
42-
是謂「備紙」之術也。
42+
是謂「運筆」之術也。
4343

4444
今有一術。名之曰「蘸色」。欲行是術。必先得一物。曰「紙」。一數。曰「色」。乃行是術曰。
4545
有物「紙」。名之曰「canv」。施「canv.getContext」於「「2d」」。名之曰「ctx」。

lib/列經.wy

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@
2626
是謂「篩剔」之術也。
2727

2828

29-
今有一術。名之曰「左併」。欲行是術。必先得一術。曰「甲」。一物。曰「乙」。一列。曰「丙」。乃行是術曰。
30-
吾有一物曰「乙」。名之曰「丁」。
29+
今有一術。名之曰「左併」。欲行是術。必先得一術。曰「甲」。一量。曰「乙」。一列。曰「丙」。乃行是術曰。
30+
吾有一量曰「乙」。名之曰「丁」。
3131
凡「丙」中之「戊」。
3232
施「甲」於「丁」於「戊」。
3333
昔之「丁」者。今其是矣。
@@ -36,8 +36,8 @@
3636
是謂「左併」之術也。
3737

3838

39-
今有一術。名之曰「右併」。欲行是術。必先得一術。曰「甲」。一物。曰「乙」。一列。曰「丙」。乃行是術曰。
40-
吾有一物曰「乙」。名之曰「丁」。
39+
今有一術。名之曰「右併」。欲行是術。必先得一術。曰「甲」。一量。曰「乙」。一列。曰「丙」。乃行是術曰。
40+
吾有一量曰「乙」。名之曰「丁」。
4141
夫「丙」之長。名之曰「戊」。
4242
恆為是。若「戊」小於一者乃止也。
4343
夫「丙」之「戊」。夫「丁」。取二以施「甲」。
@@ -57,7 +57,7 @@
5757
夫「乙」之其餘。名之曰「乙餘」。
5858

5959
凡「乙餘」中之「丁」。
60-
施「甲」於「丁」於「甲一」。
60+
施「甲」於「丁」於「乙一」。
6161
若其小於零者。
6262
充「首」以「丁」。
6363
若非。
@@ -107,7 +107,7 @@
107107
是謂「製列」之術也。
108108

109109

110-
今有一術。名之曰「索一」。欲行是術。必先得一物。曰「甲」。一列。曰「乙」。乃行是術曰。
110+
今有一術。名之曰「索一」。欲行是術。必先得一量。曰「甲」。一列。曰「乙」。乃行是術曰。
111111
吾有一數曰一。名之曰「戊」。
112112
恆為是。若「戊」大於「甲」之長者乃止也。
113113
若「乙」等於「甲」之「戊」者。乃得「戊」也。

lib/算經.wy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@
230230
是謂「求進冪」之術也。
231231

232232
吾有三數。名之曰「取位常數甲」。曰「取位常數乙」。曰「取位上溢限」。
233-
吾有二數。名之曰「分算常數」。曰「分算上溢限甲」。曰「分算上溢限乙」。
233+
吾有三數。名之曰「分算常數」。曰「分算上溢限甲」。曰「分算上溢限乙」。
234234

235235
吾有一術。名之曰「伏羲」。乃行是術曰。
236236
加一於「上位冪」。昔之「取位常數甲」者。今其是矣。

src/compiler/js.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ class JSCompiler extends Base {
5757
value = "{}";
5858
prevobj = name;
5959
prevobjpublic = a.public;
60+
} else if (a.type == "any") {
61+
value = "undefined";
6062
}
6163
}
6264
js += `${a.public ? `var ${name} = this.` : "var "}${name}=${value};`;

src/keywords.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ var KEYWORDS_DEFINE = {
1313
: ["type", "fun"],
1414
: ["type", "bol"],
1515
: ["type", "obj"],
16+
: ["type", "any"],
1617
書之: ["print"],
1718
名之曰: ["name"],
1819
: ["call", "r"],

src/parser.js

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ try {
1010
var { NUMBER_KEYWORDS, KEYWORDS } = require("./keywords");
1111
var version = require("./version");
1212
var compilers = require("./compiler/compilers");
13-
13+
var { typecheck, printSignature } = require("./typecheck");
1414
var { expandMacros, extractMacros } = require("./macro.js");
1515
} catch (e) {}
1616

@@ -290,7 +290,7 @@ function tokens2asc(
290290
typeassert(i + 1, ["type"], "variable type");
291291
typeassert(
292292
i + 2,
293-
["data", "num", "lit", "iden", "bool"],
293+
["data", "num", "lit", "iden", "bool", "any"],
294294
"variable initialization"
295295
);
296296

@@ -393,7 +393,7 @@ function tokens2asc(
393393
i += 1;
394394
} else if (gettok(i, 0) == "op") {
395395
typeassert(i + 2, ["opord"]);
396-
var x = {};
396+
var x = { pos };
397397
if (gettok(i + 2, 1) == "l") {
398398
x.lhs = tokens[i + 1];
399399
x.rhs = tokens[i + 3];
@@ -619,6 +619,7 @@ function tokens2asc(
619619
i++;
620620
}
621621
}
622+
622623
return asc;
623624
}
624625

@@ -676,7 +677,8 @@ function compile(arg1, arg2, arg3) {
676677
: console.dir(x, { depth: null, maxArrayLength: null }),
677678
errorCallback = process.exit,
678679
lib = typeof STDLIB == "undefined" ? {} : STDLIB,
679-
reader = defaultReader
680+
reader = defaultReader,
681+
strict = false
680682
} = options;
681683

682684
if (resetVarCnt) idenMap = {};
@@ -729,6 +731,11 @@ function compile(arg1, arg2, arg3) {
729731
logCallback("\n\n=== [PASS 2] ABSTRACT SYNTAX CHAIN ===");
730732
logCallback(asc);
731733

734+
if (strict) {
735+
logCallback("\n\n=== [PASS 2.5] TYPECHECK ===");
736+
console.log(printSignature(typecheck(asc, assert)));
737+
}
738+
732739
logCallback("\n\n=== [PASS 3] COMPILER ===");
733740
var imports = [];
734741
var mwrapper = { js: jsWrapModule, py: pyWrapModule, rb: x => x }[lang];
@@ -760,6 +767,7 @@ function compile(arg1, arg2, arg3) {
760767
lang,
761768
romanizeIdentifiers,
762769
resetVarCnt: false,
770+
strict: false,
763771
logCallback,
764772
errorCallback,
765773
lib

0 commit comments

Comments
 (0)