about summary refs log tree commit diff stats
path: root/global.lua
diff options
context:
space:
mode:
Diffstat (limited to 'global.lua')
-rw-r--r--global.lua91
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
3local util = require "util" 3local util = require "util"
4local types = require("types") 4local types = require "types"
5 5table.unpack = table.unpack or unpack
6if not table.unpack then table.unpack = unpack end
7 6
8local global = { 7local 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
16for name, func in pairs(types) do 15global.luatype = type
17 if name == "lamtype" then 16global.type = types.lamtype
18 global.type = func 17
19 else 18global["number?"] = function (x) types.isa(x, "Number") end
20 global[name] = func 19global["string?"] = function (x) types.isa(x, "String") end
21 end 20global["symbol?"] = function (x) types.isa(x, "Symbol") end
22end 21global["pair?"] = function (x) types.isa(x, "Pair") end
22global["is-a?"] = function (x, t) types.isa(x, t) end
23 23
24--- Basic functions --- 24--- Basic functions ---
25 25
26global.begin = function(...) 26global.car = function (pair) return pair[1] end
27 local xs = {...} 27global.cdr = function (pair) return pair[2] end
28 return xs[#xs]
29end
30 28
31global.car = util.car 29-- global.list = types.List
32global.cdr = util.cdr
33 30
34global.list = function(...) return {...} end 31global["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 --- 41global["null?"] = function (x) return type(x) == "table" and #x == 0 end
37 42
43--- Higher-order functions ---
44--[[
38global.apply = function(fn, ...) 45global.apply = function(fn, ...)
39 local args = {...} 46 local args = {...}
40 local last = args[#args] 47 local last = args[#args]
@@ -49,7 +56,7 @@ end
49global.map = function(fn, list) 56global.map = function(fn, list)
50 return util.map(fn, list) 57 return util.map(fn, list)
51end 58end
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
58end 65end
59 66
60global["+"] = function (...) 67global.fold =
68 function (fn, lis)
69 local out = {}
70
71 return types.List(out)
72 end
73
74global["+"] = 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)
62end 77end
63 78
@@ -102,40 +117,46 @@ global["/"] = function (...)
102 end 117 end
103end 118end
104 119
105global["="] = function (...) 120--[[
106 for _, v in ipairs({...}) do 121global["="] =
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
110end
111 128
112global["<"] = function (...) 129global["<"] =
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
117end
118 136
119global["<="] = function (...) 137global["<="] =
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
124end 143end
125 144
126global[">"] = function (...) 145global[">"] =
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
131end 151end
132 152
133global[">="] = function (...) 153global[">="] =
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
138end 159end
139 160--]]
140--- 161---
141return global 162return global