diff options
author | Case Duckworth | 2024-03-04 21:01:27 -0600 |
---|---|---|
committer | Case Duckworth | 2024-03-04 21:01:27 -0600 |
commit | bbaff0e0c204c2fab216f6501dc8c11b4425b4bc (patch) | |
tree | b2a06edc7b1c8e6f86839bff8c16e06297080674 /global.lua | |
parent | Add copying (diff) | |
download | lam-first-try.tar.gz lam-first-try.zip |
Ugghhhh totally not working first-try
Diffstat (limited to 'global.lua')
-rw-r--r-- | global.lua | 91 |
1 files changed, 56 insertions, 35 deletions
diff --git a/global.lua b/global.lua index 3805912..1dea773 100644 --- a/global.lua +++ b/global.lua | |||
@@ -1,40 +1,47 @@ | |||
1 | --- lam.environment | 1 | --- lam.environment |
2 | 2 | ||
3 | local util = require "util" | 3 | local util = require "util" |
4 | local types = require("types") | 4 | local types = require "types" |
5 | 5 | table.unpack = table.unpack or unpack | |
6 | if not table.unpack then table.unpack = unpack end | ||
7 | 6 | ||
8 | local global = { | 7 | local global = { |
9 | -- constants | 8 | -- constants ---- TODO this should be at the reader level |
10 | ["#t"] = true, | 9 | ["#t"] = true, |
11 | ["#f"] = false, | 10 | ["#f"] = false, |
12 | } | 11 | } |
13 | 12 | ||
14 | --- Types --- | 13 | --- Types --- |
15 | 14 | ||
16 | for name, func in pairs(types) do | 15 | global.luatype = type |
17 | if name == "lamtype" then | 16 | global.type = types.lamtype |
18 | global.type = func | 17 | |
19 | else | 18 | global["number?"] = function (x) types.isa(x, "Number") end |
20 | global[name] = func | 19 | global["string?"] = function (x) types.isa(x, "String") end |
21 | end | 20 | global["symbol?"] = function (x) types.isa(x, "Symbol") end |
22 | end | 21 | global["pair?"] = function (x) types.isa(x, "Pair") end |
22 | global["is-a?"] = function (x, t) types.isa(x, t) end | ||
23 | 23 | ||
24 | --- Basic functions --- | 24 | --- Basic functions --- |
25 | 25 | ||
26 | global.begin = function(...) | 26 | global.car = function (pair) return pair[1] end |
27 | local xs = {...} | 27 | global.cdr = function (pair) return pair[2] end |
28 | return xs[#xs] | ||
29 | end | ||
30 | 28 | ||
31 | global.car = util.car | 29 | -- global.list = types.List |
32 | global.cdr = util.cdr | ||
33 | 30 | ||
34 | global.list = function(...) return {...} end | 31 | global["list?"] = |
32 | function (x) | ||
33 | -- TODO : detect circular lists | ||
34 | if type(x) == "table" then | ||
35 | if #x == 0 then return true end | ||
36 | if type(x[2]) ~= "table" then return false end | ||
37 | end | ||
38 | return global["list?"](x[2]) | ||
39 | end | ||
35 | 40 | ||
36 | --- Higher-order functions --- | 41 | global["null?"] = function (x) return type(x) == "table" and #x == 0 end |
37 | 42 | ||
43 | --- Higher-order functions --- | ||
44 | --[[ | ||
38 | global.apply = function(fn, ...) | 45 | global.apply = function(fn, ...) |
39 | local args = {...} | 46 | local args = {...} |
40 | local last = args[#args] | 47 | local last = args[#args] |
@@ -49,7 +56,7 @@ end | |||
49 | global.map = function(fn, list) | 56 | global.map = function(fn, list) |
50 | return util.map(fn, list) | 57 | return util.map(fn, list) |
51 | end | 58 | end |
52 | 59 | --]] | |
53 | --- Math --- | 60 | --- Math --- |
54 | -- NOTE: we do not have the full numeric tower yet! | 61 | -- NOTE: we do not have the full numeric tower yet! |
55 | 62 | ||
@@ -57,7 +64,15 @@ for name, func in pairs(math) do | |||
57 | global[name] = func | 64 | global[name] = func |
58 | end | 65 | end |
59 | 66 | ||
60 | global["+"] = function (...) | 67 | global.fold = |
68 | function (fn, lis) | ||
69 | local out = {} | ||
70 | |||
71 | return types.List(out) | ||
72 | end | ||
73 | |||
74 | global["+"] = function (lis) | ||
75 | return | ||
61 | return util.reduce({...}, 0, function (a, b) return a + b end) | 76 | return util.reduce({...}, 0, function (a, b) return a + b end) |
62 | end | 77 | end |
63 | 78 | ||
@@ -102,40 +117,46 @@ global["/"] = function (...) | |||
102 | end | 117 | end |
103 | end | 118 | end |
104 | 119 | ||
105 | global["="] = function (...) | 120 | --[[ |
106 | for _, v in ipairs({...}) do | 121 | global["="] = |
107 | if not a == b then return false end | 122 | function (...) |
123 | for _, v in ipairs({...}) do | ||
124 | if not a == b then return false end | ||
125 | end | ||
126 | return true | ||
108 | end | 127 | end |
109 | return true | ||
110 | end | ||
111 | 128 | ||
112 | global["<"] = function (...) | 129 | global["<"] = |
113 | for _, v in ipairs({...}) do | 130 | function (...) |
114 | if not a < b then return false end | 131 | for _, v in ipairs({...}) do |
132 | if not a < b then return false end | ||
133 | end | ||
134 | return true | ||
115 | end | 135 | end |
116 | return true | ||
117 | end | ||
118 | 136 | ||
119 | global["<="] = function (...) | 137 | global["<="] = |
138 | function (...) | ||
120 | for _, v in ipairs({...}) do | 139 | for _, v in ipairs({...}) do |
121 | if not a <= b then return false end | 140 | if not a <= b then return false end |
122 | end | 141 | end |
123 | return true | 142 | return true |
124 | end | 143 | end |
125 | 144 | ||
126 | global[">"] = function (...) | 145 | global[">"] = |
146 | function (...) | ||
127 | for _, v in ipairs({...}) do | 147 | for _, v in ipairs({...}) do |
128 | if not a > b then return false end | 148 | if not a > b then return false end |
129 | end | 149 | end |
130 | return true | 150 | return true |
131 | end | 151 | end |
132 | 152 | ||
133 | global[">="] = function (...) | 153 | global[">="] = |
154 | function (...) | ||
134 | for _, v in ipairs({...}) do | 155 | for _, v in ipairs({...}) do |
135 | if not a >= b then return false end | 156 | if not a >= b then return false end |
136 | end | 157 | end |
137 | return true | 158 | return true |
138 | end | 159 | end |
139 | 160 | --]] | |
140 | --- | 161 | --- |
141 | return global | 162 | return global |