12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- const AST = require('./ast')
- const Env = require('./env')
-
- module.exports = class Evaluator {
- eval(tree, env) {
- let evaluatedTree = []
-
- tree.forEach(node => {
- evaluatedTree.push(this.evalNode(node, env))
- })
-
- return evaluatedTree
- }
-
- evalNode(node, env) {
- switch (node.constructor) {
- case AST.Boolean:
- case AST.Number:
- case AST.String:
- return node
- case AST.Identifier:
- return env.get(node.name)
- case AST.Application:
- switch (node.function.constructor) {
- case AST.Identifier:
- return this.evalNode(
- new AST.Application({
- function: env.get(node.function.name),
- args: node.args,
- }),
- env
- )
- case AST.Lambda:
- let innerEnv = new Env()
-
- node.function.parameters.forEach((param, index) => {
- innerEnv.set(param.name, node.args[index])
- })
-
- return this.evalNode(node.function.body, innerEnv)
- case Function:
- let args = node.args.map(arg => {
- return this.evalNode(arg, env)
- })
- args.unshift(this)
- return node.function.call(...args)
- }
- }
-
- return node
- }
- }
|