From dd483e481c5cb5e2bf5aa7fba21bdb1a2d85fc9c Mon Sep 17 00:00:00 2001 From: Case Duckworth Date: Tue, 19 Mar 2024 22:20:42 -0500 Subject: Remove need for `lambda` to include an implicit `begin` This way i can write begin in terms of lambda --- base.lua | 8 -------- eval.lua | 15 ++++++++------- 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/base.lua b/base.lua index 9c5b5b7..6dc71e4 100644 --- a/base.lua +++ b/base.lua @@ -5,14 +5,6 @@ local type = require "type" local isNull = type.isNull base.env = { - 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 diff --git a/eval.lua b/eval.lua index e926bc4..565ead5 100644 --- a/eval.lua +++ b/eval.lua @@ -32,9 +32,13 @@ function eval.Proc (params, body, env) p, a = p.cdr, a.cdr end pp.pp(self.body) - return eval.eval( - self.body, - eval.Env(inner, self.env)) + local b = self.body + local e = eval.Env(inner, self.env) + while not isNull(b.cdr) do + eval.eval(b.car, e) + b = b.cdr + end + return eval.eval(b.car, e) end, } return setmetatable(v, mt) @@ -54,10 +58,7 @@ function eval.eval (x, env) env[args.car] = eval.eval(args.cdr.car, env) return nil elseif op == "lambda" or op == "lam" then - return eval.Proc( - args.car, - Cons("begin", args.cdr), -- i don't like this - env) + return eval.Proc(args.car, args.cdr, env) elseif op == "if" then assert(not isNull(args.cdr), "Malformed 'if'") local test, conseq, alt = -- cgit 1.4.1-21-gabe81