Browse Source

Add cons, head, and tail; remove type checking

I think there’s a better way to do type checking so I’m going to hold off on it for now and get basic functionality working for now and come back later.
master
Dylan Baker 5 years ago
parent
commit
f1466bf07a
2 changed files with 25 additions and 20 deletions
  1. 4
    10
      src/core.js
  2. 21
    10
      test/coreTest.js

+ 4
- 10
src/core.js View File

@@ -12,14 +12,8 @@ module.exports = {
12 12
   '>=': (a, b) => new AST.Boolean({ value: a.value >= b.value }),
13 13
   '<=': (a, b) => new AST.Boolean({ value: a.value <= b.value }),
14 14
   'list': (...args) => { return new AST.List({ elements: args }) },
15
-  'length': xs => {
16
-    if (xs.constructor == AST.List) {
17
-      return new AST.Number({ value: xs.elements.length })
18
-    }
19
-
20
-    return new OsloError({
21
-      line: xs.line,
22
-      message: 'length: argument is not a list'
23
-    })
24
-  }
15
+  'length': xs => new AST.Number({ value: xs.elements.length }),
16
+  'cons': (x, xs) => new AST.List({ elements: [x, ...xs.elements] }),
17
+  'head': xs => xs.elements[0],
18
+  'tail': xs => new AST.List({ elements: xs.elements.slice(1) }),
25 19
 }

+ 21
- 10
test/coreTest.js View File

@@ -18,17 +18,28 @@ test('list function', t => {
18 18
 })
19 19
 
20 20
 test('length function', t => {
21
-  t.plan(2)
21
+  t.plan(1)
22 22
 
23
-  let tree = helpers.evaluate('(length (list 1 2 3))')
23
+  const tree = helpers.evaluate('(length (list 1 2 3))')
24 24
   t.deepEqual(tree[0], new AST.Number({ value: 3 }))
25
+})
26
+
27
+test('map', t => {
28
+  t.plan(1)
29
+  const tree = helpers.evaluate(`
30
+    (define my-map
31
+      (lambda (f xs)
32
+        (if (= (length xs) 0)
33
+          (list)
34
+          (cons
35
+            (f (head xs))
36
+            (my-map f (tail xs))))))
25 37
 
26
-  tree = helpers.evaluate('(length 5)')
27
-  t.deepEqual(
28
-    tree,
29
-    new OsloError({
30
-      line: 1,
31
-      message: 'length: argument is not a list'
32
-    })
33
-  )
38
+    (my-map (lambda (x) (+ x 1)) (list 1 2 3))
39
+  `)
40
+  t.deepEqual(tree[0], new AST.List({ elements: [
41
+    new AST.Number({ value: 2 }),
42
+    new AST.Number({ value: 3 }),
43
+    new AST.Number({ value: 4 }),
44
+  ]}))
34 45
 })

Loading…
Cancel
Save