1
0
Fork 0
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:
Étienne Fildadut 2024-05-19 16:11:11 +02:00
parent 12eb1d8f68
commit 2bcb319c0a
3 changed files with 20 additions and 10 deletions

View file

@ -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

View file

@ -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

View file

@ -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