mirror of
https://github.com/Reuh/anselme.git
synced 2025-10-28 17:19:31 +00:00
Move anselme code into its own directory
This commit is contained in:
parent
404e7dd56e
commit
5dd971ff8f
179 changed files with 603 additions and 579 deletions
63
anselme/ast/Definition.lua
Normal file
63
anselme/ast/Definition.lua
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
local ast = require("anselme.ast")
|
||||
local Nil, Overloadable
|
||||
|
||||
local operator_priority = require("anselme.common").operator_priority
|
||||
|
||||
local Definition = ast.abstract.Node {
|
||||
type = "definition",
|
||||
|
||||
symbol = nil,
|
||||
expression = nil,
|
||||
format_priority = operator_priority["_=_"],
|
||||
|
||||
init = function(self, symbol, expression)
|
||||
self.symbol = symbol
|
||||
self.expression = expression
|
||||
end,
|
||||
|
||||
_format = function(self, ...)
|
||||
return self.symbol:format(...).." = "..self.expression:format_right(...)
|
||||
end,
|
||||
|
||||
traverse = function(self, fn, ...)
|
||||
fn(self.symbol, ...)
|
||||
fn(self.expression, ...)
|
||||
end,
|
||||
|
||||
_eval = function(self, state)
|
||||
if self.symbol.exported and state.scope:defined_in_current(self.symbol) then
|
||||
return Nil:new() -- export vars: can reuse existing defining
|
||||
end
|
||||
|
||||
local symbol = self.symbol:eval(state)
|
||||
if symbol.alias then
|
||||
state.scope:define_alias(symbol, self.expression)
|
||||
else
|
||||
local val = self.expression:eval(state)
|
||||
|
||||
if Overloadable:issub(val) then
|
||||
state.scope:define_overloadable(symbol, val)
|
||||
else
|
||||
state.scope:define(symbol, val)
|
||||
end
|
||||
end
|
||||
|
||||
return Nil:new()
|
||||
end,
|
||||
|
||||
_prepare = function(self, state)
|
||||
local symbol, val = self.symbol, self.expression
|
||||
symbol:prepare(state)
|
||||
val:prepare(state)
|
||||
|
||||
-- predefine exported variables
|
||||
if symbol.exported then
|
||||
self:eval(state)
|
||||
end
|
||||
end
|
||||
}
|
||||
|
||||
package.loaded[...] = Definition
|
||||
Nil, Overloadable = ast.Nil, ast.abstract.Overloadable
|
||||
|
||||
return Definition
|
||||
Loading…
Add table
Add a link
Reference in a new issue