-- This file: -- https://anggtwu.net/LUA/DiagForth1.lua.html -- https://anggtwu.net/LUA/DiagForth1.lua -- (find-angg "LUA/DiagForth1.lua") -- Author: Eduardo Ochs -- -- (defun e () (interactive) (find-angg "LUA/DiagForth1.lua")) -- (defun o () (interactive) (find-angg "LUA/DiagTeX1.lua")) -- (defun oo () (interactive) (find-dn6 "diagforth.lua")) -- -- «.dxyrun» (to "dxyrun") -- «.relplace» (to "relplace") forths = forths or {} forthe = {} -- Similar to forths[], but defines eaters. DiagForth = Class { type = "DiagForth", __index = { w = function (df) return getword() or werror() end, e = function (df) return getwordasluaexpr() or werror() end, w_w = function (df) return df:w(),df:w() end, w_w_w = function (df) return df:w(),df:w(),df:w() end, e_e = function (df) return df:e(),df:e() end, e_e_e = function (df) return df:e(),df:e(),df:e() end, e_e_w = function (df) return df:e(),df:e(),df:w() end, -- getargs = function (df,word) local ga = forthe[word] if not ga then return end if type(ga) == "function" then return ga() end if type(ga) == "string" then local methodname = ga:gsub(",", "_") if not df[methodname] then error("Bad getargs method in "..word.." -> "..methodname) end return df[methodname](df) end error("Bad getargs in word: "..word) end, dxyrun1 = function (df,word) if forths[word] then forths[word](df:getargs(word)) elseif nodes[word] then ds:push(nodes[word]) else Error("Unknown word: "..word) end end, dxyrun = function (df,str,pos_) local oldvalues = pack(subj,startcol,endcol,word,pos) setsubj(str, pos_ or 1) while getword() do df:dxyrun1(word) end subj,startcol,endcol,word,pos = unpack(oldvalues) end, -- run1 = function (df,cmd) if type(cmd) == "string" then cmd = {cmd} end local word = cmd[1] if not forths[word] then error("Unknown word: "..word) end forths[word](unpack(cmd, 2)) end, -- }, } -- «dxyrun» (to ".dxyrun") -- Replaces: (find-dn6 "diagforth.lua" "dxyrun") dxyrun = function (str, pos_) DiagForth{}:dxyrun(str,pos_) end -- -- dxyrun = function (str, pos) -- setsubj(str, pos or 1) -- while getword() do -- PP(word) -- -- if forths[word] then forths[word]() -- if forths[word] then forths[word](forthe_getargs(word)) -- elseif nodes[word] then ds:push(nodes[word]) -- else Error("Unknown word: "..word) -- end -- end -- end -- (find-dn6 "diagforth.lua" "nodes") -- (find-dn6 "diagforth.lua" "arrow-modifiers") -- (find-dn6 "diagmiddle.lua" "dvarrownodes" "forths[\"harrownodes\"] =") forthe[".p="] = "w" forthe[".slide="] = "w" forthe[".curve="] = "w" forthe[".label="] = "w" forthe[".plabel="] = "w,w" forthe[".PLABEL="] = "w,w" forths[".p="] = function (p) ds:pick(0).placement = p end forths[".slide="] = function (slide) ds:pick(0).slide = slide end forths[".curve="] = function (curve) ds:pick(0).curve = curve end forths[".label="] = function (label) ds:pick(0).label = label end forths[".plabel="] = function (p,label) ds:pick(0).placement = p ds:pick(0).label = label end forths[".PLABEL="] = function (lp,label) ds:pick(0).lplacement = lp ds:pick(0).label = label end -- (find-dn6 "diagforth.lua" "arrows" "x+=") forthe["x+="] = "e" forthe["y+="] = "e" forths["x+="] = function (dx) ds:pick(0).x = ds:pick(0).x + dx end forths["y+="] = function (dy) ds:pick(0).y = ds:pick(0).y + dy end forthe["xy+="] = "e,e" forths["xy+="] = function (dx,dy) ds:pick(0).x = ds:pick(0).x + dx ds:pick(0).y = ds:pick(0).y + dy end -- «relplace» (to ".relplace") -- (find-dn6 "diagforth.lua" "relplace") forthe["relplace"] = "e,e,w" forths["relplace"] = function (dx,dy,TeX) local x, y = ds:pick(0).x, ds:pick(0).y ds:push(storearrow(DxyPlace {{x=x+dx, y=y+dy, tex=TeX}})) end -- (misp 51 "2-category-of-cats") -- (misa "2-category-of-cats") --[[  (eepitch-lua51)  (eepitch-kill)  (eepitch-lua51) dofile "DiagForth1.lua" --]] -- Local Variables: -- coding: utf-8-unix -- End: