--- lam.repl local m = {} local read = require("read") local eval = require("eval") local pp = require("dump").pp local function schemeprint (x) -- if x == nil then return end if x == true then print("#t") elseif x == false then print("#f") elseif x == nil then print("#n") else print(x) end end local lam = [[ @,,,@ <|^ ^|> l a m | /) 0015 |I /))) acdw ------------- ]] function m.repl (prompt, infile, out) -- PROMPT should be a string, INFILE is a filename, and OUT is either a -- filename, nil (in which case it will be stdout), or false (which -- suppresses output) local inport = read.inport(infile) if out ~= false then io.output(out) io.write(lam) end io.output():setvbuf("line") if prompt then stderr = io.open("/dev/stderr", "w") -- Linux-only ! end while true do -- loop if prompt then stderr:write(prompt) stderr:flush() end -- read local ok, x = xpcall( function () return read.read(inport) end, function (e) local start = e:find(": ") return e:sub(start+2) end ) if not ok then print("(read) not ok: " .. x) x = nil end -- eval if x then local ok, val = xpcall( function () return eval.eval(x) end, function (e) local start = e:find(": ") return e:sub(start+2) end ) if not ok then print("(eval) not ok: " .. val) elseif out ~= false then -- print schemeprint(val) end end end inport:close() stderr:close() io.output():close() end -------- return m