Skip to content

Commit 5becf29

Browse files
committed
Implement general setter and getter
1 parent 70387bc commit 5becf29

File tree

3 files changed

+50
-3
lines changed

3 files changed

+50
-3
lines changed

interpreter.spec.ts

+28-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import test = require('tape')
22
import { evalAst, makeAPI } from './interpreter'
33

44
test('interpreter', t => {
5-
t.plan(24)
5+
t.plan(26)
66

77
t.deepEqual(
88
evalAst(makeAPI({}))(['+', '1', '2', '3']),
@@ -266,7 +266,7 @@ test('interpreter', t => {
266266
],
267267
),
268268
['atom', { key1: 'value1', key2: 2, key3: 3, key4: 'value4' }],
269-
'Key-Value (kv) constructor operator with evaluated arguments'
269+
'Key-Value Object (kv) constructor operator with evaluated arguments'
270270
)
271271

272272
t.deepEqual(
@@ -283,4 +283,30 @@ test('interpreter', t => {
283283
'List (ls) constructor operator with evaluated arguments'
284284
)
285285

286+
t.deepEqual(
287+
evalAst(makeAPI({}))(
288+
['get',
289+
['kv', 'key', ['kv', 'a', ['kv', 'b', 12]]],
290+
'"key"', '"a"', '"b"',
291+
],
292+
),
293+
['atom', 12],
294+
'Get (get) general getter for objects and lists'
295+
)
296+
297+
t.deepEqual(
298+
evalAst(makeAPI({}))(
299+
['process',
300+
['def',
301+
'a',
302+
['kv', 'key', ['kv', 'a', ['kv', 'b', 9]]],
303+
],
304+
['set', 'a', '"key"', '"a"', '"b"', 21],
305+
['get', 'a', '"key"', '"a"', '"b"'],
306+
],
307+
),
308+
['atom', 21],
309+
'Set (set) general setter for objects and lists'
310+
)
311+
286312
})

interpreter.ts

+21
Original file line numberDiff line numberDiff line change
@@ -201,4 +201,25 @@ export const atoms = {
201201
},
202202
// List structure
203203
ls: (api, args) => ['atom', args.map(a => api.exp(a)[1])],
204+
get: (api, args) => {
205+
let a = args.map(a => api.exp(a)[1])
206+
let res = a[0]
207+
console.log(a)
208+
console.log(a[0])
209+
for (let i = 1, len = a.length; i < len; i++) {
210+
res = res[a[i]]
211+
}
212+
return ['atom', res]
213+
},
214+
set: (api, args) => {
215+
let a = args.map(a => api.exp(a)[1])
216+
let subj = a[0]
217+
for (let i = 1, len = a.length - 2; i < len; i++) {
218+
subj = subj[a[i]]
219+
}
220+
let lastKey = a[a.length - 2]
221+
let value = a[a.length - 1]
222+
subj[lastKey] = value
223+
return ['atom', value]
224+
},
204225
}

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "lisp-js-compiler",
3-
"version": "0.0.2",
3+
"version": "0.0.3",
44
"description": "JavaScript compiler / interpreter for Lisp language",
55
"main": "lib/index.js",
66
"scripts": {

0 commit comments

Comments
 (0)