mirror of
https://github.com/Reuh/anselme.git
synced 2025-10-27 08:39:30 +00:00
[stdlib] allow named arguments in call
This commit is contained in:
parent
12eb1d8f68
commit
2bcb319c0a
3 changed files with 20 additions and 10 deletions
|
|
@ -1,5 +1,5 @@
|
|||
local ast = require("anselme.ast")
|
||||
local Identifier, Number
|
||||
local Number
|
||||
|
||||
local operator_priority = require("anselme.common").operator_priority
|
||||
|
||||
|
|
@ -25,8 +25,7 @@ ArgumentTuple = ast.abstract.Node {
|
|||
self.arity = self.arity + 1
|
||||
self.positional[self.arity] = val
|
||||
end,
|
||||
add_named = function(self, identifier, val) -- only for construction
|
||||
local name = identifier.name
|
||||
add_named = function(self, name, val) -- only for construction
|
||||
assert(not (self.named[name] or self.assignment))
|
||||
self.arity = self.arity + 1
|
||||
self.named[name] = val
|
||||
|
|
@ -82,7 +81,7 @@ ArgumentTuple = ast.abstract.Node {
|
|||
if self.positional[i] then
|
||||
r:add_positional(self.positional[i]:eval(state))
|
||||
elseif self.named[i] then
|
||||
r:add_named(Identifier:new(self.named[i]), self.named[self.named[i]]:eval(state))
|
||||
r:add_named(self.named[i], self.named[self.named[i]]:eval(state))
|
||||
else
|
||||
r:add_assignment(self.assignment:eval(state))
|
||||
end
|
||||
|
|
@ -98,7 +97,7 @@ ArgumentTuple = ast.abstract.Node {
|
|||
if self.positional[i] then
|
||||
r:add_positional(self.positional[i])
|
||||
elseif self.named[i] then
|
||||
r:add_named(Identifier:new(self.named[i]), self.named[self.named[i]])
|
||||
r:add_named(self.named[i], self.named[self.named[i]])
|
||||
else
|
||||
r:add_assignment(self.assignment)
|
||||
end
|
||||
|
|
@ -112,7 +111,7 @@ ArgumentTuple = ast.abstract.Node {
|
|||
if self.positional[i] then
|
||||
r:add_positional(self.positional[i])
|
||||
elseif self.named[i] then
|
||||
r:add_named(Identifier:new(self.named[i]), self.named[self.named[i]])
|
||||
r:add_named(self.named[i], self.named[self.named[i]])
|
||||
else
|
||||
r:add_assignment(self.assignment) -- welp it'll error below anyway
|
||||
end
|
||||
|
|
@ -208,6 +207,6 @@ ArgumentTuple = ast.abstract.Node {
|
|||
}
|
||||
|
||||
package.loaded[...] = ArgumentTuple
|
||||
Identifier, Number = ast.Identifier, ast.Number
|
||||
Number = ast.Number
|
||||
|
||||
return ArgumentTuple
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
local ast = require("anselme.ast")
|
||||
local unpack = table.unpack or unpack
|
||||
local ArgumentTuple, String, Pair
|
||||
|
||||
local operator_priority = require("anselme.common").operator_priority
|
||||
|
||||
|
|
@ -58,7 +58,15 @@ Tuple = ast.abstract.Node {
|
|||
end,
|
||||
|
||||
to_argument_tuple = function(self)
|
||||
return ast.ArgumentTuple:new(unpack(self.list))
|
||||
local args = ArgumentTuple:new()
|
||||
for _, v in self:iter() do
|
||||
if Pair:is(v) and String:is(v.name) then
|
||||
args:add_named(v.name.string, v.value)
|
||||
else
|
||||
args:add_positional(v)
|
||||
end
|
||||
end
|
||||
return args
|
||||
end,
|
||||
|
||||
get = function(self, index)
|
||||
|
|
@ -87,4 +95,7 @@ Tuple = ast.abstract.Node {
|
|||
end
|
||||
}
|
||||
|
||||
package.loaded[...] = Tuple
|
||||
ArgumentTuple, String, Pair = ast.ArgumentTuple, ast.String, ast.Pair
|
||||
|
||||
return Tuple
|
||||
|
|
|
|||
|
|
@ -46,7 +46,7 @@ return secondary {
|
|||
for _, v in ipairs(exp.list) do
|
||||
if Call:is(v) and v:is_simple_assignment() then
|
||||
local pos = v.arguments.positional
|
||||
args:add_named(pos[1].expression, pos[2])
|
||||
args:add_named(pos[1].expression.name, pos[2])
|
||||
else
|
||||
args:add_positional(v)
|
||||
end
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue