A templating language that looks like Lisp and compiles to HTML
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

evaluatorTest.js 1.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. const test = require('tape')
  2. const helpers = require('./helpers')
  3. const AST = require('../src/ast')
  4. const Evaluator = require('../src/evaluator')
  5. const OsloError = require('../src/osloError')
  6. test('applies functions from core library', t => {
  7. t.plan(1)
  8. const tree = helpers.evaluate('(+ 1 2)')
  9. t.deepEqual(tree[0], new AST.Number({ value: 3 }))
  10. })
  11. test('applies lambda functions', t => {
  12. t.plan(1)
  13. const tree = helpers.evaluate('((lambda (x y) (+ x y)) 1 2)')
  14. t.deepEqual(tree[0], new AST.Number({ value: 3 }))
  15. })
  16. test('define', t => {
  17. t.plan(2)
  18. let tree = helpers.evaluate('(define x 5) (+ x 1)')
  19. t.deepEqual(tree[0], new AST.Number({ value: 6 }))
  20. tree = helpers.evaluate('(define plusOne (lambda (x) (+ x 1))) (plusOne 5)')
  21. t.deepEqual(tree[0], new AST.Number({ value: 6 }))
  22. })
  23. test('conditionals', t => {
  24. t.plan(3)
  25. let tree = helpers.evaluate('(if #t 1 0)')
  26. t.deepEqual(tree[0], new AST.Number({ value: 1 }))
  27. tree = helpers.evaluate('(if #f 1 0)')
  28. t.deepEqual(tree[0], new AST.Number({ value: 0 }))
  29. tree = helpers.evaluate('(if (= (+ 4 9) (- 20 7)) (+ 10 9) (- 4 2))')
  30. t.deepEqual(tree[0], new AST.Number({ value: 19 }))
  31. })
  32. test('let bindings', t => {
  33. t.plan(1)
  34. const tree = helpers.evaluate('(let ((x 1) (y 2)) (+ x y))')
  35. t.deepEqual(tree[0], new AST.Number({ value: 3 }))
  36. })
  37. test('let bindings go out of scope after the let block', t => {
  38. t.plan(1)
  39. const tree = helpers.evaluate('(let ((x 1)) x) x')
  40. t.deepEqual(tree, new OsloError({ line: 1, message: 'Symbol \'x\' is not bound' }))
  41. })