Preprocessor Directives for Luvit's Require
Whenever a module is required, prepdir - once required - will check the file's source and make the changes according to the given settings.
It works by overwriting the function loadstring
, used by Luvit's require
function. Make sure to use relative paths or else Lua's require
will be used instead, thus not triggering prepdir.
You can also access the class Processor
that is returned in prepdir's require, and use it outside the loadstring
function.
_G.PREPDIR_SETTINGS = {
-- content ...
}
local modifiedStr = Processor.new(str):execute()
if str:find("@#", 1, true) then
assert(modifiedStr ~= str)
else
assert(modifiedStr == str)
end
Luvit
- A global table named
PREPDIR_SETTINGS
. This table contains the ENV in which the expressions will be executed. You can create variables and other fields. Example:
-- File a.lua
_G.PREPDIR_SETTINGS = {
DEBUG = true
}
require("prepdir")
require("b")
-- File b.lua
@#IF DEBUG
print("DEBUGGING!")
@#ELSE
print("NOT DEBUGGING!")
@#ENDIF
print(1 + 1)
Run the following command
lit install Lautenschlager-id/prepdir
A Preprocessor Directive is started by @#
. Make use of the tokens in the beginning of a new line.
The following tokens are available:
IF
, ELIF
, ELSE
, ENDIF
, and DEFINE
.
The syntax is:
@#IF expression
CHUNK
[@#ELIF expression
CHUNK
...]
[@#ELSE
CHUNK]
@#ENDIF
[@#DEFINE varname expression]
Nested proprocessor directives are now possible, however you should keep in mind that they now rely on the tab levels.
@#IF IS_SUMMING
function sum(a, b)
@#ELIF IS_SUBTRACTING
function sub(a, b)
@#ENDIF
return
a
@#IF IS_SUMMING
@#IF PLUS_ONE
+ 1
@#ENDIF
+
@#ELIF IS_SUBTRACTING
-
@#ENDIF
b
end
Depending on the settings, the result is:
function sum(a, b)
return
a
+
b
end
or
function sum(a, b)
return
a
+ 1
+
b
end
or
function sub(a, b)
return
a
-
b
end