Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement