mirror of
https://github.com/Reuh/anselme.git
synced 2025-10-27 16:49:31 +00:00
41 lines
1.2 KiB
Lua
41 lines
1.2 KiB
Lua
-- prevent an expression from being immediately evaluated, and instead only evaluate it when the node is explicitely called
|
|
-- it can be used to evaluate the expression on demand, as if the quote call AST was simply replaced by the unevaluated associated expression AST.
|
|
-- kinda like a function, but no parameters, no closure and no new scope
|
|
-- keep in mind that this thus bypass any scoping rule, closure, etc.
|
|
--
|
|
-- used for infix operators where the evaluation of the right term depends of the left one (lazy boolean operators, conditionals, etc.)
|
|
|
|
local ast = require("ast")
|
|
|
|
local Quote
|
|
Quote = ast.abstract.Node {
|
|
type = "quote",
|
|
|
|
expression = nil,
|
|
|
|
init = function(self, expression)
|
|
self.expression = expression
|
|
self.format_priority = expression.format_priority
|
|
end,
|
|
|
|
_format = function(self, ...)
|
|
return self.expression:format(...) -- Quote is generated transparently by operators
|
|
end,
|
|
|
|
traverse = function(self, fn, ...)
|
|
fn(self.expression, ...)
|
|
end,
|
|
|
|
dispatch = function(self, state, args)
|
|
if args.arity == 0 then
|
|
return self, args
|
|
else
|
|
return nil, "Quote! does not accept arguments"
|
|
end
|
|
end,
|
|
call_dispatched = function(self, state, args)
|
|
return self.expression:eval(state)
|
|
end
|
|
}
|
|
|
|
return Quote
|