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 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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue