From 9c5643d5f78e4228d47e293b421d7f388d47945f Mon Sep 17 00:00:00 2001 From: Case Duckworth Date: Tue, 19 Mar 2024 22:13:44 -0500 Subject: A new start! --- eval.lua | 39 ++++++--------------------------------- 1 file changed, 6 insertions(+), 33 deletions(-) (limited to 'eval.lua') diff --git a/eval.lua b/eval.lua index 5e897e2..e926bc4 100644 --- a/eval.lua +++ b/eval.lua @@ -1,6 +1,7 @@ --- lam.eval local eval = {} +local base = require "base" local type = require "type" local isNull, isList, isa, List, Cons = type.isNull, type.isList, type.isa, type.List, type.Cons @@ -30,6 +31,7 @@ function eval.Proc (params, body, env) inner[p.car] = a.car p, a = p.cdr, a.cdr end + pp.pp(self.body) return eval.eval( self.body, eval.Env(inner, self.env)) @@ -38,37 +40,8 @@ function eval.Proc (params, body, env) return setmetatable(v, mt) end -local global = { - begin = - function (r) - local r = r - while not isNull(r.cdr) do - r = r.cdr - end - return r.car - end, - ["+"] = - function (r) - local r, a = r, 0 - while r.cdr do - r, a = r.cdr, a + r.car - end - return a - end, - ["-"] = - function (r) - if isNull(r) then return -1 end - if isNull(r.cdr) then return (- r.car) end - local r, a = r.cdr, r.car - while r.cdr do - r, a = r.cdr, a - r.car - end - return a - end, -} - function eval.eval (x, env) - env = env or global + env = env or base.env if isa(x, "Symbol") then return env[x] elseif not isList(x) then @@ -77,13 +50,13 @@ function eval.eval (x, env) local op, args = x.car, x.cdr if op == "quote" then return args.car - elseif op == "define" then + elseif op == "define" or op == "def" then env[args.car] = eval.eval(args.cdr.car, env) return nil - elseif op == "lambda" then + elseif op == "lambda" or op == "lam" then return eval.Proc( args.car, - Cons("begin", args.cdr), + Cons("begin", args.cdr), -- i don't like this env) elseif op == "if" then assert(not isNull(args.cdr), "Malformed 'if'") -- cgit 1.4.1-21-gabe81