Warning: this is an htmlized version!
The original is here, and
the conversion rules are here.
-- This file:
--   http://anggtwu.net/LUA/Repl3.lua.html
--   http://anggtwu.net/LUA/Repl3.lua
--          (find-angg "LUA/Repl3.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
--
-- (defun e () (interactive) (find-angg "LUA/Repl3.lua"))
-- Based on: (find-angg "LUA/Repl2.lua")
--           (find-angg "LUA/lua50init.lua" "Repl2.lua")
-- See:      (find-angg "LUA/lua50init.lua" "Repl3.lua")
--           (find-angg "LUA/Repl1.lua" "EdrxEmacsRepl")
--           (find-luarepl-links)

-- «.MultiLineCmd»		(to "MultiLineCmd")
-- «.MultiLineCmd-tests»	(to "MultiLineCmd-tests")
-- «.Repl»			(to "Repl")
-- «.Repl-tests»		(to "Repl-tests")
--
-- «.getmeaning»		(to "getmeaning")
--   «.printmeaning»		(to "printmeaning")
--   «.printpgfkey»		(to "printpgfkey")
--   «.printtikzkey»		(to "printtikzkey")
-- «.getmeaning-tests»		(to "getmeaning-tests")
-- «.texrun»			(to "texrun")
-- «.texrun-tests»		(to "texrun-tests")

require "PreTraceback1"      -- (find-angg "LUA/PreTraceback1.lua")
require "XPCall1"            -- (find-angg "LUA/XPCall1.lua")



--  __  __       _ _   _ _     _             ____               _ 
-- |  \/  |_   _| | |_(_) |   (_)_ __   ___ / ___|_ __ ___   __| |
-- | |\/| | | | | | __| | |   | | '_ \ / _ \ |   | '_ ` _ \ / _` |
-- | |  | | |_| | | |_| | |___| | | | |  __/ |___| | | | | | (_| |
-- |_|  |_|\__,_|_|\__|_|_____|_|_| |_|\___|\____|_| |_| |_|\__,_|
--                                                                
-- «MultiLineCmd»  (to ".MultiLineCmd")

MultiLineCmd = Class {
  type = "MultiLineCmd",
  from = function (line) return MultiLineCmd({line}) end,
  test = function (line1, ...)
      return PPV(MultiLineCmd({line1, morelines={...}}):addmorelines())
    end,
  __tostring = function (mlc) return mlc:concat() end,
  __index = {
    add = function (mlc, line) table.insert(mlc, line) end,
    prefix = function (mlc) return mlc[1]:match("^=?") end,
    concat = function (mlc) return table.concat(mlc, "\n") end,
    --
    luacode = function (mlc)
        return (mlc:concat():gsub("^=", "return "))
      end,
    luacodepr = function (mlc)
        return (mlc:concat():gsub("^=(.*)$", "print(%1\n  )"))
      end,
    --
    incomplete0 = function (mlc, f, err)
        return err and err:find(" near '?<eof>'?$")
      end,
    status0 = function (mlc)
        local f0,err0 = loadstring(mlc:luacode())
        local f1,err1 = loadstring(mlc:luacodepr())
        if mlc:incomplete0(f0, err0) then return "incomplete" end
        if not f0 then return "comp error",nil,err0 end
        return "complete",f1,err1
      end,
    compile = function (mlc)
        mlc.status, mlc.f, mlc.err = mlc:status0()
        return mlc
      end,
    incomplete = function (mlc)
        mlc:compile()
        return mlc.status == "incomplete"
      end,
    --
    -- For MultiLineCmd.test
    addmorelines = function (mlc)
        while mlc:incomplete() and #mlc.morelines>0 do
          mlc:add(mlc.morelines[1]); table.remove(mlc.morelines, 1)
        end
        return mlc
      end,
  },
}

-- «MultiLineCmd-tests»  (to ".MultiLineCmd-tests")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Repl3.lua"
mlc = MultiLineCmd.from("print('foo')")
PPV(mlc)
mlc:compile()
PPV(mlc)
mlc.f()

test = MultiLineCmd.test
mlc = test("print(2+3)", "foo")
mlc = test("print(2+", "3)", "foo")
mlc = test("print(2+", "3!", "foo")
mlc = test("= 2", "+3", "foo")
mlc = test("= 2+", "3", "foo")
mlc = test("= 2+", "3+", "4", "foo")
PPV(mlc)
= mlc.f()

--]]


--  ____            _ 
-- |  _ \ ___ _ __ | |
-- | |_) / _ \ '_ \| |
-- |  _ <  __/ |_) | |
-- |_| \_\___| .__/|_|
--           |_|      
--
-- «Repl»  (to ".Repl")
-- A simple REPL. No redirection, default errorhandler, no coroutines.
--
Repl = Class {
  type    = "Repl",
  new     = function () return Repl({}) end,
  __index = {
    read00 = function (r, prompt) write(prompt); return io.read() end,
    read0 = function (r, prompt) return r:read00(prompt) end,
    read1 = function (r) return r:read0 ">>> " end,
    read2 = function (r) return r:read0 "... " end,
    read = function (r)
        r.mlc = MultiLineCmd.from(r:read1())
        while r.mlc:incomplete() do r.mlc:add(r:read2()) end
        return r
      end,
    --
    -- (find-es "lua5" "xpcall")
    comperror = function (r) return r.mlc.status == "comp error" end,
    printcomperror = function (r) print(r.mlc.err) end,
    evalprint = function (r)
        -- local errhandler = function(err)
        --     print(tostring(err) .. debug.traceback())
        --   end
        -- xpcall(r.mlc.f, errhandler)
        XPCall({f=r.mlc.f}):xpcall6()
      end,
    readevalprint = function (r)
        r:read()
        if r:comperror()
        then r:printcomperror()
	else r:evalprint()
        end
      end,
    repl = function (r)
        while not r.STOP do
          r:readevalprint()
        end
      end,
  },
}

-- «Repl-tests»  (to ".Repl-tests")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Repl3.lua"
run_repl  = function () r = Repl.new(); r:repl() end
stop_repl = function () r.STOP = "please" end
run_repl()

print(2+
 3+
 4)

print(2+
 3!           -- aborts with a syntax error

print(2+
 nil)         -- shows a traceback. Bad frames: 14,13,5.

= ptb
-------------------------
= ptb[5]      -- fix this
= ptb[5]:v()
= ptb[5].short_src
= ptb[5].short_src:sub(10,-3)
= "string "..ptb[5].short_src:sub(10,-3)

-- (find-angg "LUA/PrintFunction1.lua" "PrintFunction" "_main0")

PrintFunction.__index._shortsrc = function (pf)
    if not pf.short_src then return end
    if pf.source:match"^@" then return ee_shorten(pf.source:sub(2)) end
    if pf.source == "=stdin" then return "stdin" end
    if pf.short_src:match"^%[string" then return "string "..pf.short_src:sub(10,-3) end
    return "Bad source: "..pf.source
  end

= ptb
= ptb[13]      -- fix this
= ptb[14]      -- fix this
--------------------------
= ptb[13]:v()
= ptb[14]:v()

stop_repl()

--]]



--             _                              _             
--   __ _  ___| |_ _ __ ___   ___  __ _ _ __ (_)_ __   __ _ 
--  / _` |/ _ \ __| '_ ` _ \ / _ \/ _` | '_ \| | '_ \ / _` |
-- | (_| |  __/ |_| | | | | |  __/ (_| | | | | | | | | (_| |
--  \__, |\___|\__|_| |_| |_|\___|\__,_|_| |_|_|_| |_|\__, |
--  |___/                                             |___/ 
--
-- Used by:  (find-angg "LUA/Show2.lua" "defs_repl")
-- Based on: (find-angg "LUA/Repl2.lua" "getmeaning")
--           (find-angg "LUA/tikz1.lua" "repl")
--
-- «getmeaning»      (to ".getmeaning")
--   «printmeaning»  (to ".printmeaning")
--   «printpgfkey»   (to ".printpgfkey")
--   «printtikzkey»  (to ".printtikzkey")
getmeaning0   = function (str) return token.get_meaning(str) end
getmeaning    = function (str) return token.get_meaning(str) or "" end
printmeaning0 = function (str) print(getmeaning(str)) end
printmeaning  = function (str) print(str..": "..getmeaning(str)) end
printpgfkey   = function (str) printmeaning("pgfk@"..str.."/.@cmd") end
printtikzkey  = function (str) printpgfkey("/tikz/"..str) end

-- «getmeaning-tests»  (to ".getmeaning-tests")
--[==[
* (show2-use "/tmp/")
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
loadshow2()
defs.repl = true
= ([[HELLO \condrepl]]):show00()
= ([[HELLO \condrepl]]):show0 ()
= ([[HELLO \condrepl]]):save  ()
= ([[HELLO \condrepl]]):show  ()
* (etv)

* (eepitch-shell)
* (eepitch-kill)
* (eepitch-shell)
cd /tmp/ && REPL=1 lualatex Show2.tex
  require "Tos2"
  PPC(package.loaders)
  PPC(Tos.__index)
  printmeaning "newpage"
  printmeaning "@oddfoot"

* (show2-use "$SHOW2LATEXDIR/")
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
loadshow2()
require "Tikz2"
defs.repl = true
= ([[HELLO \condrepl]]):show00()
= ([[HELLO \condrepl]]):show0 ()
= ([[HELLO \condrepl]]):save  ()
= ([[HELLO \condrepl]]):show  ()
* (etv)

* (eepitch-shell)
* (eepitch-kill)
* (eepitch-shell)
cd /tmp/ && REPL=1 lualatex Show2.tex
-- See:  (find-fline "~/LUA/tikz1.lua")
printmeaning("pgfk@/tikz/rounded corners/.@cmd")
printpgfkey      ("/tikz/rounded corners")
printtikzkey           ("rounded corners")
printtikzkey           ("right")

--]==]



-- Local Variables:
-- coding:  utf-8-unix
-- End: