about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorCase Duckworth2024-03-19 22:20:42 -0500
committerCase Duckworth2024-03-19 22:20:42 -0500
commitdd483e481c5cb5e2bf5aa7fba21bdb1a2d85fc9c (patch)
tree99e391db9f209f7fca8db8e9aa8edbbb05cff28d
parentA new start! (diff)
downloadlam-dd483e481c5cb5e2bf5aa7fba21bdb1a2d85fc9c.tar.gz
lam-dd483e481c5cb5e2bf5aa7fba21bdb1a2d85fc9c.zip
Remove need for `lambda` to include an implicit `begin` new-start
This way i can write begin in terms of lambda
-rw-r--r--base.lua8
-rw-r--r--eval.lua15
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"
5local isNull = type.isNull 5local isNull = type.isNull
6 6
7base.env = { 7base.env = {
8 begin =
9 function (r)
10 local r = r
11 while not isNull(r.cdr) do
12 r = r.cdr
13 end
14 return r.car
15 end,
16 ["+"] = 8 ["+"] =
17 function (r) 9 function (r)
18 local r, a = r, 0 10 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)
32 p, a = p.cdr, a.cdr 32 p, a = p.cdr, a.cdr
33 end 33 end
34 pp.pp(self.body) 34 pp.pp(self.body)
35 return eval.eval( 35 local b = self.body
36 self.body, 36 local e = eval.Env(inner, self.env)
37 eval.Env(inner, self.env)) 37 while not isNull(b.cdr) do
38 eval.eval(b.car, e)
39 b = b.cdr
40 end
41 return eval.eval(b.car, e)
38 end, 42 end,
39 } 43 }
40 return setmetatable(v, mt) 44 return setmetatable(v, mt)
@@ -54,10 +58,7 @@ function eval.eval (x, env)
54 env[args.car] = eval.eval(args.cdr.car, env) 58 env[args.car] = eval.eval(args.cdr.car, env)
55 return nil 59 return nil
56 elseif op == "lambda" or op == "lam" then 60 elseif op == "lambda" or op == "lam" then
57 return eval.Proc( 61 return eval.Proc(args.car, args.cdr, env)
58 args.car,
59 Cons("begin", args.cdr), -- i don't like this
60 env)
61 elseif op == "if" then 62 elseif op == "if" then
62 assert(not isNull(args.cdr), "Malformed 'if'") 63 assert(not isNull(args.cdr), "Malformed 'if'")
63 local test, conseq, alt = 64 local test, conseq, alt =