Skip to content

Commit 87cb577

Browse files
committed
Coreをstdから分離
1 parent bec8a2f commit 87cb577

3 files changed

Lines changed: 145 additions & 138 deletions

File tree

src/interpreter/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { NULL, FN_NATIVE, BOOL, NUM, STR, ARR, OBJ, FN, ERROR } from './value.js
1313
import { getPrimProp } from './primitive-props.js';
1414
import { Variable } from './variable.js';
1515
import { Reference } from './reference.js';
16+
import { stdCore } from './lib/core.js';
1617
import type { JsValue } from './util.js';
1718
import type { Value, VFn, VUserFn } from './value.js';
1819

@@ -69,7 +70,7 @@ export class Interpreter {
6970

7071
this.scope = new Scope([
7172
new Map(
72-
Object.entries({ ...globals, ...io })
73+
Object.entries({ ...globals,...stdCore, ...io })
7374
.map(([k, v]) => [k, Variable.const(v)]),
7475
),
7576
]);

src/interpreter/lib/core.ts

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
import { NUM, STR, FN_NATIVE, FALSE, TRUE, ARR, NULL } from '../value.js';
2+
import { assertNumber, assertString, assertBoolean, eq, expectAny, reprValue } from '../util.js';
3+
import { AiScriptUserError } from '../../error.js';
4+
import { AISCRIPT_VERSION } from '../../constants.js';
5+
import type { Value } from '../value.js';
6+
7+
export const stdCore: Record<`Core:${string}`, Value> = {
8+
'Core:v': STR(AISCRIPT_VERSION),
9+
10+
'Core:ai': STR('kawaii'),
11+
12+
'Core:not': FN_NATIVE(([a]) => {
13+
assertBoolean(a);
14+
return a.value ? FALSE : TRUE;
15+
}),
16+
17+
'Core:eq': FN_NATIVE(([a, b]) => {
18+
expectAny(a);
19+
expectAny(b);
20+
return eq(a, b) ? TRUE : FALSE;
21+
}),
22+
23+
'Core:neq': FN_NATIVE(([a, b]) => {
24+
expectAny(a);
25+
expectAny(b);
26+
return eq(a, b) ? FALSE : TRUE;
27+
}),
28+
29+
'Core:and': FN_NATIVE(([a, b]) => {
30+
assertBoolean(a);
31+
if (!a.value) return FALSE;
32+
assertBoolean(b);
33+
return b.value ? TRUE : FALSE;
34+
}),
35+
36+
'Core:or': FN_NATIVE(([a, b]) => {
37+
assertBoolean(a);
38+
if (a.value) return TRUE;
39+
assertBoolean(b);
40+
return b.value ? TRUE : FALSE;
41+
}),
42+
43+
'Core:add': FN_NATIVE(([a, b]) => {
44+
assertNumber(a);
45+
assertNumber(b);
46+
return NUM(a.value + b.value);
47+
}),
48+
49+
'Core:sub': FN_NATIVE(([a, b]) => {
50+
assertNumber(a);
51+
assertNumber(b);
52+
return NUM(a.value - b.value);
53+
}),
54+
55+
'Core:mul': FN_NATIVE(([a, b]) => {
56+
assertNumber(a);
57+
assertNumber(b);
58+
return NUM(a.value * b.value);
59+
}),
60+
61+
'Core:pow': FN_NATIVE(([a, b]) => {
62+
assertNumber(a);
63+
assertNumber(b);
64+
const res = a.value ** b.value;
65+
return NUM(res);
66+
}),
67+
68+
'Core:div': FN_NATIVE(([a, b]) => {
69+
assertNumber(a);
70+
assertNumber(b);
71+
const res = a.value / b.value;
72+
return NUM(res);
73+
}),
74+
75+
'Core:mod': FN_NATIVE(([a, b]) => {
76+
assertNumber(a);
77+
assertNumber(b);
78+
return NUM(a.value % b.value);
79+
}),
80+
81+
'Core:gt': FN_NATIVE(([a, b]) => {
82+
assertNumber(a);
83+
assertNumber(b);
84+
return a.value > b.value ? TRUE : FALSE;
85+
}),
86+
87+
'Core:lt': FN_NATIVE(([a, b]) => {
88+
assertNumber(a);
89+
assertNumber(b);
90+
return a.value < b.value ? TRUE : FALSE;
91+
}),
92+
93+
'Core:gteq': FN_NATIVE(([a, b]) => {
94+
assertNumber(a);
95+
assertNumber(b);
96+
return a.value >= b.value ? TRUE : FALSE;
97+
}),
98+
99+
'Core:lteq': FN_NATIVE(([a, b]) => {
100+
assertNumber(a);
101+
assertNumber(b);
102+
return a.value <= b.value ? TRUE : FALSE;
103+
}),
104+
105+
'Core:type': FN_NATIVE(([v]) => {
106+
expectAny(v);
107+
return STR(v.type);
108+
}),
109+
110+
'Core:to_str': FN_NATIVE(([v]) => {
111+
expectAny(v);
112+
113+
return STR(reprValue(v));
114+
}),
115+
116+
'Core:range': FN_NATIVE(([a, b]) => {
117+
assertNumber(a);
118+
assertNumber(b);
119+
if (a.value < b.value) {
120+
return ARR(Array.from({ length: (b.value - a.value) + 1 }, (_, i) => NUM(i + a.value)));
121+
} else if (a.value > b.value) {
122+
return ARR(Array.from({ length: (a.value - b.value) + 1 }, (_, i) => NUM(a.value - i)));
123+
} else {
124+
return ARR([a]);
125+
}
126+
}),
127+
128+
'Core:sleep': FN_NATIVE(async ([delay]) => {
129+
assertNumber(delay);
130+
await new Promise((r) => setTimeout(r, delay.value));
131+
return NULL;
132+
}),
133+
134+
'Core:abort': FN_NATIVE(async ([message]) => {
135+
assertString(message);
136+
throw new AiScriptUserError(message.value);
137+
}),
138+
};

src/interpreter/lib/std.ts

Lines changed: 5 additions & 137 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
/* eslint-disable no-empty-pattern */
22
import { v4 as uuid } from 'uuid';
3-
import { NUM, STR, FN_NATIVE, FALSE, TRUE, ARR, NULL, BOOL, OBJ, ERROR } from '../value.js';
4-
import { assertNumber, assertString, assertBoolean, valToJs, jsToVal, assertFunction, assertObject, eq, expectAny, assertArray, reprValue } from '../util.js';
5-
import { AiScriptRuntimeError, AiScriptUserError } from '../../error.js';
6-
import { AISCRIPT_VERSION } from '../../constants.js';
3+
import { NUM, STR, FN_NATIVE, ARR, NULL, BOOL, OBJ, ERROR } from '../value.js';
4+
import { assertNumber, assertString, assertBoolean, valToJs, jsToVal, assertFunction, assertObject, expectAny, assertArray } from '../util.js';
5+
import { AiScriptRuntimeError } from '../../error.js';
76
import { textDecoder } from '../../const.js';
87
import { stdMath } from './math.js';
98
import type { Value } from '../value.js';
@@ -13,137 +12,6 @@ export const std: Record<string, Value> = {
1312

1413
'help': STR('SEE: https://github.com/syuilo/aiscript/blob/master/docs/get-started.md'),
1514

16-
//#region Core
17-
'Core:v': STR(AISCRIPT_VERSION),
18-
19-
'Core:ai': STR('kawaii'),
20-
21-
'Core:not': FN_NATIVE(([a]) => {
22-
assertBoolean(a);
23-
return a.value ? FALSE : TRUE;
24-
}),
25-
26-
'Core:eq': FN_NATIVE(([a, b]) => {
27-
expectAny(a);
28-
expectAny(b);
29-
return eq(a, b) ? TRUE : FALSE;
30-
}),
31-
32-
'Core:neq': FN_NATIVE(([a, b]) => {
33-
expectAny(a);
34-
expectAny(b);
35-
return eq(a, b) ? FALSE : TRUE;
36-
}),
37-
38-
'Core:and': FN_NATIVE(([a, b]) => {
39-
assertBoolean(a);
40-
if (!a.value) return FALSE;
41-
assertBoolean(b);
42-
return b.value ? TRUE : FALSE;
43-
}),
44-
45-
'Core:or': FN_NATIVE(([a, b]) => {
46-
assertBoolean(a);
47-
if (a.value) return TRUE;
48-
assertBoolean(b);
49-
return b.value ? TRUE : FALSE;
50-
}),
51-
52-
'Core:add': FN_NATIVE(([a, b]) => {
53-
assertNumber(a);
54-
assertNumber(b);
55-
return NUM(a.value + b.value);
56-
}),
57-
58-
'Core:sub': FN_NATIVE(([a, b]) => {
59-
assertNumber(a);
60-
assertNumber(b);
61-
return NUM(a.value - b.value);
62-
}),
63-
64-
'Core:mul': FN_NATIVE(([a, b]) => {
65-
assertNumber(a);
66-
assertNumber(b);
67-
return NUM(a.value * b.value);
68-
}),
69-
70-
'Core:pow': FN_NATIVE(([a, b]) => {
71-
assertNumber(a);
72-
assertNumber(b);
73-
const res = a.value ** b.value;
74-
return NUM(res);
75-
}),
76-
77-
'Core:div': FN_NATIVE(([a, b]) => {
78-
assertNumber(a);
79-
assertNumber(b);
80-
const res = a.value / b.value;
81-
return NUM(res);
82-
}),
83-
84-
'Core:mod': FN_NATIVE(([a, b]) => {
85-
assertNumber(a);
86-
assertNumber(b);
87-
return NUM(a.value % b.value);
88-
}),
89-
90-
'Core:gt': FN_NATIVE(([a, b]) => {
91-
assertNumber(a);
92-
assertNumber(b);
93-
return a.value > b.value ? TRUE : FALSE;
94-
}),
95-
96-
'Core:lt': FN_NATIVE(([a, b]) => {
97-
assertNumber(a);
98-
assertNumber(b);
99-
return a.value < b.value ? TRUE : FALSE;
100-
}),
101-
102-
'Core:gteq': FN_NATIVE(([a, b]) => {
103-
assertNumber(a);
104-
assertNumber(b);
105-
return a.value >= b.value ? TRUE : FALSE;
106-
}),
107-
108-
'Core:lteq': FN_NATIVE(([a, b]) => {
109-
assertNumber(a);
110-
assertNumber(b);
111-
return a.value <= b.value ? TRUE : FALSE;
112-
}),
113-
114-
'Core:type': FN_NATIVE(([v]) => {
115-
expectAny(v);
116-
return STR(v.type);
117-
}),
118-
119-
'Core:to_str': FN_NATIVE(([v]) => {
120-
expectAny(v);
121-
122-
return STR(reprValue(v));
123-
}),
124-
125-
'Core:range': FN_NATIVE(([a, b]) => {
126-
assertNumber(a);
127-
assertNumber(b);
128-
if (a.value < b.value) {
129-
return ARR(Array.from({ length: (b.value - a.value) + 1 }, (_, i) => NUM(i + a.value)));
130-
} else if (a.value > b.value) {
131-
return ARR(Array.from({ length: (a.value - b.value) + 1 }, (_, i) => NUM(a.value - i)));
132-
} else {
133-
return ARR([a]);
134-
}
135-
}),
136-
'Core:sleep': FN_NATIVE(async ([delay]) => {
137-
assertNumber(delay);
138-
await new Promise((r) => setTimeout(r, delay.value));
139-
return NULL;
140-
}),
141-
'Core:abort': FN_NATIVE(async ([message]) => {
142-
assertString(message);
143-
throw new AiScriptUserError(message.value);
144-
}),
145-
//#endregion
146-
14715
//#region Util
14816
'Util:uuid': FN_NATIVE(() => {
14917
return STR(uuid());
@@ -318,12 +186,12 @@ export const std: Record<string, Value> = {
318186
'Uri:encode_full': FN_NATIVE(([v]) => {
319187
assertString(v);
320188
return STR(encodeURI(v.value));
321-
}),
189+
}),
322190

323191
'Uri:encode_component': FN_NATIVE(([v]) => {
324192
assertString(v);
325193
return STR(encodeURIComponent(v.value));
326-
}),
194+
}),
327195

328196
'Uri:decode_full': FN_NATIVE(([v]) => {
329197
assertString(v);

0 commit comments

Comments
 (0)