|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- This file:
-- http://angg.twu.net/LUA/Repl2.lua.html
-- http://angg.twu.net/LUA/Repl2.lua
-- (find-angg "LUA/Repl2.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
-- Version: 2022nov05
-- Public domain.
--
-- This my n-attempt to write a REPL for Lua.
-- The suffix "2" in the name of this file means:
-- "this is a complete rewrite of Repl1.lua, with no attempts
-- to be backwards compatible."
-- At this moment this REPL is used only in lualatex. See the tests in:
-- (to "getmeaning-tests")
-- (to "texrun-tests")
-- and the documentation in:
-- http://angg.twu.net/eev-tikz.html#another-repl
-- (find-angg "LUA/lua50init.lua" "Repl2.lua")
-- (find-angg "LUA/tikz1.lua" "repl")
--
-- See the comments in my other REPLs:
-- (find-angg "LUA/Repl1.lua")
-- https://github.com/edrx/emlua/#introduction
-- http://angg.twu.net/emlua/README.org.html
-- http://angg.twu.net/dednat6.html#luatex
--
-- (defun r1 () (interactive) (find-angg "LUA/Repl1.lua"))
-- (defun r2 () (interactive) (find-angg "LUA/Repl2.lua"))
-- (find-angg "LUA/Repl1.lua" "EdrxEmacsRepl")
-- (find-angg "LUA/Repl1.lua" "MultiLineCmd")
-- «.MultiLineCmd» (to "MultiLineCmd")
-- «.MultiLineCmd-tests» (to "MultiLineCmd-tests")
-- «.Repl2» (to "Repl2")
-- «.Repl2-tests» (to "Repl2-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")
-- __ __ _ _ _ _ _ ____ _
-- | \/ |_ _| | |_(_) | (_)_ __ ___ / ___|_ __ ___ __| |
-- | |\/| | | | | | __| | | | | '_ \ / _ \ | | '_ ` _ \ / _` |
-- | | | | |_| | | |_| | |___| | | | | __/ |___| | | | | | (_| |
-- |_| |_|\__,_|_|\__|_|_____|_|_| |_|\___|\____|_| |_| |_|\__,_|
--
-- «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 "Repl2.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()
--]]
-- ____ _ _
-- | _ \ ___ _ __ | / |
-- | |_) / _ \ '_ \| | |
-- | _ < __/ |_) | | |
-- |_| \_\___| .__/|_|_|
-- |_|
--
-- «Repl2» (to ".Repl2")
-- A simple REPL. No redirection, default errorhandler, no coroutines.
--
Repl2 = Class {
type = "Repl2",
new = function () return Repl2({}) 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)
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,
},
}
-- «Repl2-tests» (to ".Repl2-tests")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Repl2.lua"
run_repl = function () r = Repl2.new(); r:repl() end
stop_repl = function () r.STOP = "please" end
run_repl()
print(2+
3+
4)
print(2+
3!
print(2+
nil)
stop_repl()
--]]
-- _ _
-- __ _ ___| |_ _ __ ___ ___ __ _ _ __ (_)_ __ __ _
-- / _` |/ _ \ __| '_ ` _ \ / _ \/ _` | '_ \| | '_ \ / _` |
-- | (_| | __/ |_| | | | | | __/ (_| | | | | | | | | (_| |
-- \__, |\___|\__|_| |_| |_|\___|\__,_|_| |_|_|_| |_|\__, |
-- |___/ |___/
--
-- See: (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")
--[==[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
ee_dofile "~/LUA/tikz1.lua" -- (find-fline "~/LUA/tikz1.lua")
repl = repl2
savetex()
**
* (eepitch-shell)
* (eepitch-kill)
* (eepitch-shell)
cd /tmp/ && lualatex tikz1.tex
printmeaning("newpage")
printmeaning("pgfk@/tikz/rounded corners/.@cmd")
printpgfkey ("/tikz/rounded corners")
printtikzkey ("rounded corners")
printtikzkey ("right")
--]==]
-- _
-- | |_ _____ ___ __ _ _ _ __
-- | __/ _ \ \/ / '__| | | | '_ \
-- | || __/> <| | | |_| | | | |
-- \__\___/_/\_\_| \__,_|_| |_|
--
-- «texrun» (to ".texrun")
-- (find-angg "LUA/lua50init.lua" "Repl2.lua")
-- (find-angg "LUA/lua50init.lua" "Repl2.lua" "stop_repl2_now =")
texrun = function (str) tex.print(str.."\\repl"); stop_repl2_now() end
-- «texrun-tests» (to ".texrun-tests")
--[==[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
ee_dofile "~/LUA/tikz1.lua" -- (find-fline "~/LUA/tikz1.lua")
repl = repl2
savetex()
**
* (eepitch-shell)
* (eepitch-kill)
* (eepitch-shell)
cd /tmp/ && lualatex tikz1.tex
texrun [=[ \luaprintmeaning{bla} ]=]
texrun [=[ \def\bla{BLA} \luaprintmeaning{bla} ]=]
texrun [=[ \luaprintmeaning{bla} ]=]
texrun [=[ \def\bla#1{BLA} \luaprintmeaning{bla} ]=]
texrun [=[ \luaprintmeaning{bla} ]=]
texrun [=[
\pgfkeys{/a/.code=(a:#1)}
\pgfkeys{/b/.code=(b:#1)}
\pgfkeys{/c/.style={/a=AA,/b=BB,/a=#1}}
\pgfkeys{/s/.store in=/sss}
]=]
printpgfkey("/b")
printpgfkey("/c")
printpgfkey("/s")
--]==]
-- Local Variables:
-- coding: utf-8-unix
-- End: