1
0
Fork 0
mirror of https://github.com/Reuh/anselme.git synced 2025-10-27 16:49:31 +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 ast = require("anselme.ast")
local Identifier, Number local Number
local operator_priority = require("anselme.common").operator_priority local operator_priority = require("anselme.common").operator_priority
@ -25,8 +25,7 @@ ArgumentTuple = ast.abstract.Node {
self.arity = self.arity + 1 self.arity = self.arity + 1
self.positional[self.arity] = val self.positional[self.arity] = val
end, end,
add_named = function(self, identifier, val) -- only for construction add_named = function(self, name, val) -- only for construction
local name = identifier.name
assert(not (self.named[name] or self.assignment)) assert(not (self.named[name] or self.assignment))
self.arity = self.arity + 1 self.arity = self.arity + 1
self.named[name] = val self.named[name] = val
@ -82,7 +81,7 @@ ArgumentTuple = ast.abstract.Node {
if self.positional[i] then if self.positional[i] then
r:add_positional(self.positional[i]:eval(state)) r:add_positional(self.positional[i]:eval(state))
elseif self.named[i] then 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 else
r:add_assignment(self.assignment:eval(state)) r:add_assignment(self.assignment:eval(state))
end end
@ -98,7 +97,7 @@ ArgumentTuple = ast.abstract.Node {
if self.positional[i] then if self.positional[i] then
r:add_positional(self.positional[i]) r:add_positional(self.positional[i])
elseif self.named[i] then 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 else
r:add_assignment(self.assignment) r:add_assignment(self.assignment)
end end
@ -112,7 +111,7 @@ ArgumentTuple = ast.abstract.Node {
if self.positional[i] then if self.positional[i] then
r:add_positional(self.positional[i]) r:add_positional(self.positional[i])
elseif self.named[i] then 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 else
r:add_assignment(self.assignment) -- welp it'll error below anyway r:add_assignment(self.assignment) -- welp it'll error below anyway
end end
@ -208,6 +207,6 @@ ArgumentTuple = ast.abstract.Node {
} }
package.loaded[...] = ArgumentTuple package.loaded[...] = ArgumentTuple
Identifier, Number = ast.Identifier, ast.Number Number = ast.Number
return ArgumentTuple return ArgumentTuple

View file

@ -1,5 +1,5 @@
local ast = require("anselme.ast") local ast = require("anselme.ast")
local unpack = table.unpack or unpack local ArgumentTuple, String, Pair
local operator_priority = require("anselme.common").operator_priority local operator_priority = require("anselme.common").operator_priority
@ -58,7 +58,15 @@ Tuple = ast.abstract.Node {
end, end,
to_argument_tuple = function(self) 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, end,
get = function(self, index) get = function(self, index)
@ -87,4 +95,7 @@ Tuple = ast.abstract.Node {
end end
} }
package.loaded[...] = Tuple
ArgumentTuple, String, Pair = ast.ArgumentTuple, ast.String, ast.Pair
return Tuple return Tuple

View file

@ -46,7 +46,7 @@ return secondary {
for _, v in ipairs(exp.list) do for _, v in ipairs(exp.list) do
if Call:is(v) and v:is_simple_assignment() then if Call:is(v) and v:is_simple_assignment() then
local pos = v.arguments.positional local pos = v.arguments.positional
args:add_named(pos[1].expression, pos[2]) args:add_named(pos[1].expression.name, pos[2])
else else
args:add_positional(v) args:add_positional(v)
end end