|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- This file:
-- http://angg.twu.net/LATEX/2021dn6-error-handling.lua.html
-- http://angg.twu.net/LATEX/2021dn6-error-handling.lua
-- (find-angg "LATEX/2021dn6-error-handling.lua")
-- (find-LATEX "2021dn6-error-handling.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
--
-- See: (find-LATEX "2020dn6-error-handling.lua")
-- «.getword» (to "getword")
-- «.arrow-modifiers» (to "arrow-modifiers")
-- «.dxyrun» (to "dxyrun")
-- «getword» (to ".getword")
-- (find-dn6 "parse.lua" "getword")
-- (find-dn6 "parse.lua" "getword" "getwordasluaexpr =")
--
-- These are higher-level variants of getword() that accept error
-- messages. Mnemonic: they have "_"s in their names, and
-- "getword_lua" is more readable than "getwordlua".
diagword1 = function (funname, errmsg)
errmsg = errmsg or "argument"
return getword() or diagerror(format("In '%s': missing %s", funname, errmsg))
end
diagword2 = function (funname, errmsg1, errmsg2)
local a = diagword1(funname, errmsg1 or "first argument")
local b = diagword2(funname, errmsg2 or "second argument")
return a,b
end
diagwordlua = function (funname, errmsg)
local w = diagword1(funname, errmsg)
return expr(w)
end
diagwordlualua = function (funname, errmsg1, errmsg2)
local w1,w2 = diagword2(funname, errmsg)
return expr(w1), expr(w2)
end
-- «arrow-modifiers» (to ".arrow-modifiers")
-- (find-dn6 "diagforth.lua" "arrow-modifiers")
forths[".plabel="] = function ()
local p, label = diagword2(".plabel=", "first argument (placement)",
"second argument (label)")
ds:pick(0).placement, ds:pick(0).label = p, label
end
forths[".slide="] = function ()
ds:pick(0).slide = diagword1(".slide=")
end
forths[".curve="] = function ()
ds:pick(0).curve = diagword1(".curve=")
end
forths["xy+="] = function ()
local dx,dy = diagwordlualua(".plabel=", "first argument (dx)",
"second argument (dy)")
ds:pick(0).x = ds:pick(0).x + dx
ds:pick(0).y = ds:pick(0).y + dy
end
-- «dxyrun» (to ".dxyrun")
-- (find-dn6 "diagforth.lua" "diag-head" "dxyrun =")
-- (find-dn6file "parse.lua" "setsubj =")
-- (find-es "lua5" "xpcall-2020")
-- It should be possible to use dxyrun0 recursively (for macros!) and
-- it should be possible to call it using xpcall and display the
-- offending line before the traceback...
-- (find-dn6 "heads6.lua" "diag-head")
-- (find-es "lua5" "xpcall-2020")
-- dxyrun = function (str, pos, linenum)
-- dxyrun0(str, pos, linenum)
-- end
dxyrun0 = function (str, pos)
local a,b,c,d = subj,pos,startcol,endcol -- backup globals
setsubj(str, pos or 1)
while getword() do
-- PP(word)
if forths[word] then forths[word]()
elseif nodes[word] then ds:push(nodes[word])
else Error("Unknown word: "..word)
end
end
local subj,pos,startcol,endcol = a,b,c,d -- restore globals
end
dxyrun_errhandler = function (errmsg)
local fname = tf.name
local b = lastheadblock
local blockinfo = format("%s-block in lines %d-%d", b.head, b.i, b.j)
local where = format("In %s, in the %s, in line %d",
fname, blockinfo, dxyrun_linenum)
local whereinsubj = (" "):rep(startcol - 1)..("^"):rep(endcol - startcol)
local errmsg0 = errmsg:gsub("^[^ ]* ", "")
print(errmsg0)
print(where..":")
print()
print(subj)
print(whereinsubj)
-- print(debug.traceback())
print()
print("Dednat6 error - aborting!")
end
-- TODO: rewrite dxyrun using the MyXpcall class.
-- (find-angg "edrxrepl/edrxrepl.lua" "MyXpcall-class")
-- (find-angg "LUA/lua50init.lua" "MyXpcall")
dxyrun = function (str, pos, linenum)
dxyrun_linenum = linenum
local f = function () dxyrun0(str, pos) end
local status = xpcall(f, dxyrun_errhandler)
if status == false then os.exit(1) end
end
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
loaddednat6()
dofile "2021dn6-error-handling.lua"
--]]
-- Local Variables:
-- coding: utf-8-unix
-- End: