From bbaff0e0c204c2fab216f6501dc8c11b4425b4bc Mon Sep 17 00:00:00 2001 From: Case Duckworth Date: Mon, 4 Mar 2024 21:01:27 -0600 Subject: Ugghhhh totally not working --- global.lua | 91 ++++++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 56 insertions(+), 35 deletions(-) (limited to 'global.lua') diff --git a/global.lua b/global.lua index 3805912..1dea773 100644 --- a/global.lua +++ b/global.lua @@ -1,40 +1,47 @@ --- lam.environment local util = require "util" -local types = require("types") - -if not table.unpack then table.unpack = unpack end +local types = require "types" +table.unpack = table.unpack or unpack local global = { - -- constants + -- constants ---- TODO this should be at the reader level ["#t"] = true, ["#f"] = false, } --- Types --- -for name, func in pairs(types) do - if name == "lamtype" then - global.type = func - else - global[name] = func - end -end +global.luatype = type +global.type = types.lamtype + +global["number?"] = function (x) types.isa(x, "Number") end +global["string?"] = function (x) types.isa(x, "String") end +global["symbol?"] = function (x) types.isa(x, "Symbol") end +global["pair?"] = function (x) types.isa(x, "Pair") end +global["is-a?"] = function (x, t) types.isa(x, t) end --- Basic functions --- -global.begin = function(...) - local xs = {...} - return xs[#xs] -end +global.car = function (pair) return pair[1] end +global.cdr = function (pair) return pair[2] end -global.car = util.car -global.cdr = util.cdr +-- global.list = types.List -global.list = function(...) return {...} end +global["list?"] = + function (x) + -- TODO : detect circular lists + if type(x) == "table" then + if #x == 0 then return true end + if type(x[2]) ~= "table" then return false end + end + return global["list?"](x[2]) + end ---- Higher-order functions --- +global["null?"] = function (x) return type(x) == "table" and #x == 0 end +--- Higher-order functions --- +--[[ global.apply = function(fn, ...) local args = {...} local last = args[#args] @@ -49,7 +56,7 @@ end global.map = function(fn, list) return util.map(fn, list) end - +--]] --- Math --- -- NOTE: we do not have the full numeric tower yet! @@ -57,7 +64,15 @@ for name, func in pairs(math) do global[name] = func end -global["+"] = function (...) +global.fold = + function (fn, lis) + local out = {} + + return types.List(out) + end + +global["+"] = function (lis) + return return util.reduce({...}, 0, function (a, b) return a + b end) end @@ -102,40 +117,46 @@ global["/"] = function (...) end end -global["="] = function (...) - for _, v in ipairs({...}) do - if not a == b then return false end +--[[ +global["="] = + function (...) + for _, v in ipairs({...}) do + if not a == b then return false end + end + return true end - return true -end -global["<"] = function (...) - for _, v in ipairs({...}) do - if not a < b then return false end +global["<"] = + function (...) + for _, v in ipairs({...}) do + if not a < b then return false end + end + return true end - return true -end -global["<="] = function (...) +global["<="] = + function (...) for _, v in ipairs({...}) do if not a <= b then return false end end return true end -global[">"] = function (...) +global[">"] = + function (...) for _, v in ipairs({...}) do if not a > b then return false end end return true end -global[">="] = function (...) +global[">="] = + function (...) for _, v in ipairs({...}) do if not a >= b then return false end end return true end - +--]] --- return global -- cgit 1.4.1-21-gabe81