Skip to content

Commit 9069a62

Browse files
committed
Complete async interpreter implementation
1 parent 883917f commit 9069a62

8 files changed

+141
-128
lines changed

LANGUAGE.md

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
# Language description
1+
# Language
2+
3+
This languaje is sync by default, this means all is awaited. If you need to make something parallel or async must use special functions for this (built-in async functions comming soon)
4+
5+
## Sintax
26

37
There are 2 kind of expressions:
48

index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@ export function getAst (code) {
88

99
export const run = env => {
1010
let _evalAst = evalAst(makeAPI(env))
11-
return code => _evalAst(getAst(code))
11+
return async code => await _evalAst(getAst(code))
1212
}

interpreter.spec.ts

+30-31
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,29 @@
11
import test = require('tape')
22
import { evalAst, makeAPI } from './interpreter'
33

4-
test('interpreter', t => {
4+
test('interpreter', async t => {
55
t.plan(27)
66

77
t.deepEqual(
8-
evalAst(makeAPI({}))(['+', '1', '2', '3']),
8+
await evalAst(makeAPI({}))(['+', '1', '2', '3']),
99
['atom', 6],
1010
'Simple expression'
1111
)
1212

1313
t.deepEqual(
14-
evalAst(makeAPI({}))(['*', '2', '3', ['-', '3', '4'], '2', ['/', '1', '2']]),
14+
await evalAst(makeAPI({}))(['*', '2', '3', ['-', '3', '4'], '2', ['/', '1', '2']]),
1515
['atom', -6],
1616
'Composed expression'
1717
)
1818

1919
t.deepEqual(
20-
evalAst(makeAPI({ x: ['atom', 5], y: ['atom', 3] }))(['*', 'x', 'y', ['-', '3', '4'], '2', ['/', '1', '2']]),
20+
await evalAst(makeAPI({ x: ['atom', 5], y: ['atom', 3] }))(['*', 'x', 'y', ['-', '3', '4'], '2', ['/', '1', '2']]),
2121
['atom', -15],
2222
'Composed expression with env constants'
2323
)
2424

2525
t.deepEqual(
26-
evalAst(makeAPI({}))(
26+
await evalAst(makeAPI({}))(
2727
['process',
2828
['def', ['a1', 'x'], 'x'],
2929
[['cat', '"a"', '"1"'], 11],
@@ -34,7 +34,7 @@ test('interpreter', t => {
3434
)
3535

3636
t.deepEqual(
37-
evalAst(makeAPI({ x: ['atom', 5], y: ['atom', 3] }))(
37+
await evalAst(makeAPI({ x: ['atom', 5], y: ['atom', 3] }))(
3838
['process',
3939
['def', 'a', '2'],
4040
['def', 'b', '3'],
@@ -47,7 +47,7 @@ test('interpreter', t => {
4747
)
4848

4949
t.deepEqual(
50-
evalAst(makeAPI({}))(
50+
await evalAst(makeAPI({}))(
5151
['process',
5252
['def', ['identity', 'x'], 'x'],
5353
['identity', 7],
@@ -58,7 +58,7 @@ test('interpreter', t => {
5858
)
5959

6060
t.deepEqual(
61-
evalAst(makeAPI({}))(
61+
await evalAst(makeAPI({}))(
6262
['process',
6363
['def',
6464
['inc', 'x'],
@@ -72,7 +72,7 @@ test('interpreter', t => {
7272
)
7373

7474
t.deepEqual(
75-
evalAst(makeAPI({}))(
75+
await evalAst(makeAPI({}))(
7676
['process',
7777
['def',
7878
['sum', 'x', 'y'],
@@ -86,13 +86,13 @@ test('interpreter', t => {
8686
)
8787

8888
t.deepEqual(
89-
evalAst(makeAPI({}))(
89+
await evalAst(makeAPI({}))(
9090
['process',
9191
['def',
9292
['sqrtIter', 'x', 'guess'],
9393
['if',
9494
['=', ['Math', '.abs', ['-', 'x', ['*', 'guess', 'guess']]], 0],
95-
'guess',
95+
['Math', '.floor', 'guess'],
9696
['sqrtIter', 'x', ['/', ['+', 'guess', ['/', 'x', 'guess']], '2']],
9797
],
9898
],
@@ -108,19 +108,19 @@ test('interpreter', t => {
108108
)
109109

110110
t.deepEqual(
111-
evalAst(makeAPI({}))(['+', ['*', '1', '2', '3'], '2', ['/', '27', '3', '3']]),
111+
await evalAst(makeAPI({}))(['+', ['*', '1', '2', '3'], '2', ['/', '27', '3', '3']]),
112112
['atom', 11],
113113
'Mathematical operators'
114114
)
115115

116116
t.deepEqual(
117-
evalAst(makeAPI({}))(['or', ['and', 'true', ['>', '3', '4']], 'false', ['<', '27', '3'], ['or', 'true', 'false', 'false']]),
117+
await evalAst(makeAPI({}))(['or', ['and', 'true', ['>', '3', '4']], 'false', ['<', '27', '3'], ['or', 'true', 'false', 'false']]),
118118
['atom', true],
119119
'Logical operators'
120120
)
121121

122122
t.deepEqual(
123-
evalAst(makeAPI({}))(
123+
await evalAst(makeAPI({}))(
124124
['process',
125125
['def', 'a', `'log'`],
126126
['def', 'b', `'E'`],
@@ -132,18 +132,18 @@ test('interpreter', t => {
132132
)
133133

134134
t.deepEqual(
135-
evalAst(makeAPI({}))(
135+
await evalAst(makeAPI({}))(
136136
['process',
137137
['Math', '.log', ['Math', '.E']],
138138
]
139139
),
140140
['atom', 1],
141-
'Math operators with evaluated name'
141+
'Math operators with known name'
142142
)
143143

144144
// Special forms
145145
t.deepEqual(
146-
evalAst(makeAPI({}))(
146+
await evalAst(makeAPI({}))(
147147
['process',
148148
['def', 'x', ['process',
149149
['def', 'a', 2],
@@ -158,7 +158,7 @@ test('interpreter', t => {
158158
)
159159

160160
t.deepEqual(
161-
evalAst(makeAPI({}))(
161+
await evalAst(makeAPI({}))(
162162
['cond',
163163
['false', 2],
164164
[['>', 1, 2], 11],
@@ -172,7 +172,7 @@ test('interpreter', t => {
172172

173173

174174
t.deepEqual(
175-
evalAst(makeAPI({}))(
175+
await evalAst(makeAPI({}))(
176176
['cond',
177177
['false', 2],
178178
[['<', 10, 2], 11],
@@ -185,7 +185,7 @@ test('interpreter', t => {
185185
)
186186

187187
t.deepEqual(
188-
evalAst(makeAPI({}))(
188+
await evalAst(makeAPI({}))(
189189
['if',
190190
['<', 1, 2],
191191
10,
@@ -197,7 +197,7 @@ test('interpreter', t => {
197197
)
198198

199199
t.deepEqual(
200-
evalAst(makeAPI({}))(
200+
await evalAst(makeAPI({}))(
201201
['if',
202202
['>', 1, 2],
203203
10,
@@ -209,24 +209,23 @@ test('interpreter', t => {
209209
)
210210

211211
t.deepEqual(
212-
evalAst(makeAPI({}))(
212+
await evalAst(makeAPI({}))(
213213
[['->', ['x', 'y'], ['+', 'x', 'y']], 23, 34],
214214
),
215215
['atom', 57],
216216
'Lambda definition and application'
217217
)
218218

219-
debugger
220219
t.deepEqual(
221-
evalAst(makeAPI({}))(
220+
await evalAst(makeAPI({}))(
222221
[['->', 'param', ['+', 'param', '10']], 23],
223222
),
224223
['atom', 33],
225224
'Lambda definition and application (one parameter)'
226225
)
227226

228227
t.deepEqual(
229-
evalAst(makeAPI({}))(
228+
await evalAst(makeAPI({}))(
230229
[
231230
['.',
232231
['->', ['x'], ['+', 'x', '1']],
@@ -240,7 +239,7 @@ test('interpreter', t => {
240239
)
241240

242241
t.deepEqual(
243-
evalAst(makeAPI({}))(
242+
await evalAst(makeAPI({}))(
244243
[
245244
['pipe',
246245
['->', ['x'], ['+', 'x', '1']],
@@ -254,7 +253,7 @@ test('interpreter', t => {
254253
)
255254

256255
t.deepEqual(
257-
evalAst(makeAPI({}))(
256+
await evalAst(makeAPI({}))(
258257
['kv',
259258
'key1', '"value1"',
260259
'key2', '2',
@@ -266,7 +265,7 @@ test('interpreter', t => {
266265
)
267266

268267
t.deepEqual(
269-
evalAst(makeAPI({}))(
268+
await evalAst(makeAPI({}))(
270269
['kv',
271270
'key1', '"value1"',
272271
['cat', '"key"', '2'], '2',
@@ -279,7 +278,7 @@ test('interpreter', t => {
279278
)
280279

281280
t.deepEqual(
282-
evalAst(makeAPI({}))(
281+
await evalAst(makeAPI({}))(
283282
['ls',
284283
'1',
285284
['+', '2', '3'],
@@ -293,7 +292,7 @@ test('interpreter', t => {
293292
)
294293

295294
t.deepEqual(
296-
evalAst(makeAPI({}))(
295+
await evalAst(makeAPI({}))(
297296
['get',
298297
['kv', 'key', ['kv', 'a', ['kv', 'b', 12]]],
299298
'"key"', '"a"', '"b"',
@@ -304,7 +303,7 @@ test('interpreter', t => {
304303
)
305304

306305
t.deepEqual(
307-
evalAst(makeAPI({}))(
306+
await evalAst(makeAPI({}))(
308307
['process',
309308
['def',
310309
'a',

0 commit comments

Comments
 (0)