Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- -*- mode: lua -*- -- This is the `withdef.lua' file of BlogMe. -- Copyright 2005 Eduardo Ochs <edrx@mat.puc-rio.br> -- Author: Eduardo Ochs <edrx@mat.puc-rio.br> -- Version: 2005aug25 -- License: GPL (I'll add the complete headers later) -- Latest: http://angg.twu.net/blogme/withdef.lua -- -- This is not a standalone file! To use it include this in a blogme -- script (NOT in a blogme2 script): -- [lua: require "withdef.lua" ] -- One of the first things that blogme.lua does is to add the -- directory where blogme.lua was found to the include path, so if -- this file is in the same dir as blogme.lua then everything should -- work. -- -- Blogme2 comes with these functions by default. Do not "require" -- this file! --For debugging (this line is Lua code!): -- def [[ MYP 1L arr "!", PP(arr) ]] -- I'm not sure: Do I need to save the "e" for vrest_q before -- running vargs4_q? vrest_q = function () parse("_*"); return substring(pos, e) end vargs1_q = function () return vrest_q() end vargs2_q = function () return vword(), vrest_q() end vargs3_q = function () return vword(), vword(), vrest_q() end vargs4_q = function () return vword(), vword(), vword(), vrest_q() end restspecs["1Q"] = vargs1_q restspecs["2Q"] = vargs2_q restspecs["3Q"] = vargs3_q restspecs["4Q"] = vargs4_q ----------[ WITH (and its friends $ and list) ]---------- -- Our "WITH" is similar to Lisp's "let". -- Example of use: -- [WITH [list a valueofa b valueofb] -- a is [$ a], b is [$ b]; -- [WITH [list a othervalueofa b othervalueofb] -- inside the sub-"WITH": a is [$ a], b is [$ b];] -- outside again, a is [$ a], b is [$ b]. -- ] -- The above gets expanded to this (modulo whitespace): -- a is valueofa, b is valueofb; -- inside the sub-"WITH": a is othervalueofa, b is othervalueofb; -- outside again, a is valueofa, b is valueofb. -- _VARS = {} def [[ $ 1 varname _VARS[varname] or ""]] def [[ list 1L arr arr ]] withvars = function (plist, code) local _PREVVARS = {} for i=1,getn(plist),2 do local varname, value = plist[i], plist[i+1] tinsert(_PREVVARS, {varname, _VARS[varname]}) _VARS[varname] = value end local result = code() for i=getn(_PREVVARS),1,-1 do local varname, value = _PREVVARS[i][1], _PREVVARS[i][2] _VARS[varname] = value end return result end _G["WITH"] = function () return withvars(vword(), vrest) or "" end setgetargs(nop, "WITH") ----------[ tools needed by DEF ]---------- -- (find-blogme "blogme.lua" "def") -- (find-blogme "blogme.lua" "vargs2") -- (find-blogme "blogme.lua" "blogme_test") -- (find-blogme "blogme.lua" "vparse") withsubj = function (newsubj, code) local oldsubj, oldpos = subj, pos subj, pos = newsubj, 0 local result = code() subj, pos = oldsubj, oldpos return result end withvars_expand = function (plist, text) return withvars(plist, function () return withsubj(text, vparse) end) end zip = function (arr1, arr2) local arr12 = {} for i=1,getn(arr1) do tinsert(arr12, arr1[i]) tinsert(arr12, arr2[i]) end return arr12 end ----------[ DEF itself ]---------- -- This: -- [DEF HREF 2 url,text <a href="[$ url]">[$ str]</a>] -- runs as something like this: -- HREF = function (url, text) -- return withvars_expand({"url", url, "text", text}, -- "<a href=\"[$ url]\">[$ str]</a>") -- end -- _GETARGS["HREF"] = vargs2 -- Here's how to understand how the definition of "DEF", below, -- works. First we transform the above into: -- local wordname = "HREF" -- local argparser = vargs2 -- local argnamelist = {"url", "text"} -- local text = "<a href=\"[$ url]\">[$ str]</a>" -- _G[wordname] = function (...) -- return withvars_expand(zip(argnamelist, arg), text) -- end -- _GETARGS[wordname] = argparser -- And now it's easy to write the word DEF: -- DEF = function (wordname, argparser_spec, argnames, text) local argparser = restspecs[argparser_spec] or _G[argparser_spec] local argnamelist = split(argnames, "([^,]+)") _G[wordname] = function (...) return withvars_expand(zip(argnamelist, arg), text) end _GETARGS[wordname] = argparser return "" end setgetargs(vargs4_q, "DEF") -- Local Variables: -- coding: raw-text-unix -- modes: (fundamental-mode lua-mode) -- ee-anchor-format: "\n%s = function" -- End: