stdio.lua 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. require("love.event")
  2. local fennel = require("lib.fennel")
  3. local view = require("lib.fennelview")
  4. local event, channel = ...
  5. local function display(s)
  6. io.write(s)
  7. return io.flush()
  8. end
  9. do local _ = display end
  10. local function prompt()
  11. return display("\n>> ")
  12. end
  13. do local _ = prompt end
  14. local function read_chunk()
  15. local input = io.read()
  16. if input then
  17. return (input .. "\n")
  18. end
  19. end
  20. do local _ = read_chunk end
  21. local input = ""
  22. local function _0_(...)
  23. if channel then
  24. local bytestream, clearstream = fennel.granulate(read_chunk)
  25. local function _0_()
  26. local c = (bytestream() or 10)
  27. input = (input .. string.char(c))
  28. return c
  29. end
  30. local read = fennel.parser(_0_)
  31. while true do
  32. prompt()
  33. input = ""
  34. do
  35. local ok, ast = pcall(read)
  36. local function _1_(...)
  37. if not ok then
  38. return display(("Parse error:" .. ast .. "\n"))
  39. else
  40. love.event.push(event, input)
  41. return display(channel:demand())
  42. end
  43. end
  44. _1_(...)
  45. end
  46. end
  47. return nil
  48. end
  49. end
  50. _0_(...)
  51. local function start_repl()
  52. local code = love.filesystem.read("stdio.fnl")
  53. local function _1_()
  54. if code then
  55. return love.filesystem.newFileData(fennel.compileString(code), "io")
  56. else
  57. return love.filesystem.read("lib/stdio.lua")
  58. end
  59. end
  60. local lua = _1_()
  61. local thread = love.thread.newThread(lua)
  62. local io_channel = love.thread.newChannel()
  63. thread:start("eval", io_channel)
  64. local function _2_(input)
  65. local ok, val = pcall(fennel.eval, input)
  66. local function _3_()
  67. if ok then
  68. return view(val)
  69. else
  70. return val
  71. end
  72. end
  73. return io_channel:push(_3_())
  74. end
  75. love.handlers.eval = _2_
  76. return nil
  77. end
  78. return {start = start_repl}