spudOS/src/bin/tryhaskell.lua

79 lines
1.8 KiB
Lua
Raw Normal View History

local function URL_encode(str)
if str then
str = str:gsub("\n", "\r\n")
str = str:gsub("([^%w %-%_%.%~])", function(c)
return ("%%%02X"):format(string.byte(c))
end)
str = str:gsub(" ", "+")
end
return str
end
local API = "http://tryhaskell.org/eval"
local function evaluate(code, files, stdin)
local args = json.encode {
stdin or {},
files
}
local data = string.format("exp=%s&args=%s", URL_encode(code), URL_encode(args))
local h, err = http.post(API, data, {
["User-Agent"] = "HasCCell"
})
if err then error(err) end
local c = h.readAll()
h.close()
return json.decode(c)
end
local function save_files(files)
local f = fs.open(".tryhaskell-files", "w")
f.write(textutils.serialise(files))
f.close()
end
local function load_files()
local f = fs.open(".tryhaskell-files", "r")
local files = textutils.unserialise(f.readAll())
f.close()
return files
end
local function preprocess_output(o)
local o = o:gsub("", "'"):gsub("", "'")
return o
end
local history = {}
local files = {}
local ok, result = pcall(load_files)
if ok then files = result end
local last_expr
local function handle_result(result)
if result.success then
local s = result.success
for _, line in pairs(s.stdout) do write(preprocess_output(line)) end
print(preprocess_output(s.value))
print("::", preprocess_output(s.type))
files = s.files
save_files(files)
elseif result.error then
textutils.pagedPrint(preprocess_output(result.error))
else
write "-> "
local next_line = read()
handle_result(evaluate(last_expr, files, { next_line }))
end
end
while true do
write "|> "
local input = read(nil, history)
last_expr = input
table.insert(history, input)
local result = evaluate(input, files)
handle_result(result)
end