potatOS/src/bin/tryhaskell.lua

79 lines
1.8 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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