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.

evaluator.js 1.8KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. const AST = require('./ast')
  2. const Env = require('./env')
  3. module.exports = class Evaluator {
  4. eval(tree, env) {
  5. this.env = env
  6. let evaluatedTree = []
  7. tree.forEach(node => {
  8. let evaluatedNode = this.evalNode(node)
  9. if (evaluatedNode) {
  10. evaluatedTree.push(evaluatedNode)
  11. }
  12. })
  13. console.log(
  14. require('util').inspect(evaluatedTree, { depth: null })
  15. )
  16. return evaluatedTree
  17. }
  18. evalNode(node, env) {
  19. if (!env) env = this.env
  20. switch (node.constructor) {
  21. case AST.Boolean:
  22. case AST.Number:
  23. case AST.String:
  24. return node
  25. case AST.Identifier:
  26. return env.get(node.name)
  27. case AST.Definition:
  28. this.env.set(node.symbol.name, node.value)
  29. return false
  30. case AST.Conditional:
  31. let result = this.evalNode(node.condition, env)
  32. if (result.constructor == AST.Boolean && result.value === true) {
  33. return this.evalNode(node.ifCase, env)
  34. }
  35. return this.evalNode(node.elseCase, env)
  36. case AST.Application:
  37. switch (node.function.constructor) {
  38. case AST.Identifier:
  39. return this.evalNode(
  40. new AST.Application({
  41. function: env.get(node.function.name),
  42. args: node.args,
  43. }),
  44. )
  45. case AST.Lambda:
  46. let innerEnv = new Env(env)
  47. node.function.parameters.forEach((param, index) => {
  48. innerEnv.set(param.name, node.args[index])
  49. })
  50. return this.evalNode(node.function.body, innerEnv)
  51. case Function:
  52. let args = node.args.map(arg => {
  53. return this.evalNode(arg)
  54. })
  55. args.unshift(this)
  56. return node.function.call(...args)
  57. }
  58. }
  59. return node
  60. }
  61. }