mirror of
https://github.com/Reuh/anselme.git
synced 2025-10-27 16:49:31 +00:00
Allow argument-less calling using ! suffix
This commit is contained in:
parent
6e5cbf9e7e
commit
d5b1a9f225
6 changed files with 94 additions and 30 deletions
|
|
@ -1,6 +1,5 @@
|
||||||
local expression
|
local expression
|
||||||
local to_lua, from_lua, eval_text, is_of_type, truthy, format, pretty_type, get_variable, tags, eval_text_callback, events, flatten_list
|
local to_lua, from_lua, eval_text, is_of_type, truthy, format, pretty_type, get_variable, tags, eval_text_callback, events, flatten_list
|
||||||
local copy
|
|
||||||
|
|
||||||
local run
|
local run
|
||||||
|
|
||||||
|
|
@ -445,6 +444,5 @@ expression = require((...):gsub("interpreter%.expression$", "parser.expression")
|
||||||
flatten_list = require((...):gsub("interpreter%.expression$", "parser.common")).flatten_list
|
flatten_list = require((...):gsub("interpreter%.expression$", "parser.common")).flatten_list
|
||||||
local common = require((...):gsub("expression$", "common"))
|
local common = require((...):gsub("expression$", "common"))
|
||||||
to_lua, from_lua, eval_text, is_of_type, truthy, format, pretty_type, get_variable, tags, eval_text_callback, events = common.to_lua, common.from_lua, common.eval_text, common.is_of_type, common.truthy, common.format, common.pretty_type, common.get_variable, common.tags, common.eval_text_callback, common.events
|
to_lua, from_lua, eval_text, is_of_type, truthy, format, pretty_type, get_variable, tags, eval_text_callback, events = common.to_lua, common.from_lua, common.eval_text, common.is_of_type, common.truthy, common.format, common.pretty_type, common.get_variable, common.tags, common.eval_text_callback, common.events
|
||||||
copy = require((...):gsub("interpreter%.expression$", "common")).copy
|
|
||||||
|
|
||||||
return eval
|
return eval
|
||||||
|
|
|
||||||
|
|
@ -169,6 +169,8 @@ local function expression(s, state, namespace, current_priority, operating_on)
|
||||||
if not args then return args, err end
|
if not args then return args, err end
|
||||||
if err:match("[^%s]") then return nil, ("unexpected %q at end of argument list"):format(err) end
|
if err:match("[^%s]") then return nil, ("unexpected %q at end of argument list"):format(err) end
|
||||||
end
|
end
|
||||||
|
elseif r:match("^%!") then -- optional, to call with no arg, no explicit call
|
||||||
|
r = r:match("^%!(.*)$")
|
||||||
end
|
end
|
||||||
-- find compatible variant
|
-- find compatible variant
|
||||||
local variant, err = find_function(state, namespace, name, args, explicit_call)
|
local variant, err = find_function(state, namespace, name, args, explicit_call)
|
||||||
|
|
@ -314,18 +316,27 @@ local function expression(s, state, namespace, current_priority, operating_on)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
-- index / call
|
-- index / call
|
||||||
if s:match("^%b()") then
|
if s:match("^%b()") or s:match("^%!") then
|
||||||
local content, r = s:match("^(%b())(.*)$")
|
|
||||||
content = content:gsub("^%(", ""):gsub("%)$", "")
|
|
||||||
-- get arguments
|
|
||||||
local args = operating_on
|
local args = operating_on
|
||||||
if content:match("[^%s]") then
|
local explicit_call, r
|
||||||
local right, r_paren = expression(content, state, namespace)
|
-- call with args, explicit call
|
||||||
if not right then return right, r_paren end
|
if s:match("^%b()") then
|
||||||
if r_paren:match("[^%s]") then return nil, ("unexpected %q at end of index/call expression"):format(r_paren) end
|
explicit_call = true
|
||||||
args = { type = "list", left = args, right = right }
|
local content
|
||||||
|
content, r = s:match("^(%b())(.*)$")
|
||||||
|
content = content:gsub("^%(", ""):gsub("%)$", "")
|
||||||
|
-- get arguments
|
||||||
|
if content:match("[^%s]") then
|
||||||
|
local right, r_paren = expression(content, state, namespace)
|
||||||
|
if not right then return right, r_paren end
|
||||||
|
if r_paren:match("[^%s]") then return nil, ("unexpected %q at end of index/call expression"):format(r_paren) end
|
||||||
|
args = { type = "list", left = args, right = right }
|
||||||
|
end
|
||||||
|
-- call with no arg, no explicit call
|
||||||
|
elseif s:match("^%!") then
|
||||||
|
r = s:match("^%!(.*)$")
|
||||||
end
|
end
|
||||||
local variant, err = find_function(state, namespace, "()", args, true)
|
local variant, err = find_function(state, namespace, "()", args, explicit_call)
|
||||||
if not variant then return variant, err end
|
if not variant then return variant, err end
|
||||||
return expression(r, state, namespace, current_priority, variant)
|
return expression(r, state, namespace, current_priority, variant)
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -119,6 +119,9 @@ functions = {
|
||||||
return v
|
return v
|
||||||
end
|
end
|
||||||
},
|
},
|
||||||
|
["()(fn::function reference, l...)"] = {
|
||||||
|
-- bypassed, this case is manually handled in the expression interpreter
|
||||||
|
},
|
||||||
-- format
|
-- format
|
||||||
["{}(v)"] = {
|
["{}(v)"] = {
|
||||||
mode = "raw",
|
mode = "raw",
|
||||||
|
|
|
||||||
12
test/tests/function reference call explicit call.ans
Normal file
12
test/tests/function reference call explicit call.ans
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
$ fn
|
||||||
|
1
|
||||||
|
§ c
|
||||||
|
2
|
||||||
|
|
||||||
|
:c = &fn
|
||||||
|
|
||||||
|
~ c!
|
||||||
|
|
||||||
|
~ c()
|
||||||
|
|
||||||
|
~ c!
|
||||||
40
test/tests/function reference call explicit call.lua
Normal file
40
test/tests/function reference call explicit call.lua
Normal file
|
|
@ -0,0 +1,40 @@
|
||||||
|
local _={}
|
||||||
|
_[17]={}
|
||||||
|
_[16]={}
|
||||||
|
_[15]={}
|
||||||
|
_[14]={}
|
||||||
|
_[13]={}
|
||||||
|
_[12]={text="2",tags=_[17]}
|
||||||
|
_[11]={text="2",tags=_[16]}
|
||||||
|
_[10]={text="1",tags=_[15]}
|
||||||
|
_[9]={text="2",tags=_[14]}
|
||||||
|
_[8]={text="1",tags=_[13]}
|
||||||
|
_[7]={_[12]}
|
||||||
|
_[6]={_[10],_[11]}
|
||||||
|
_[5]={_[8],_[9]}
|
||||||
|
_[4]={"return"}
|
||||||
|
_[3]={"text",_[7]}
|
||||||
|
_[2]={"text",_[6]}
|
||||||
|
_[1]={"text",_[5]}
|
||||||
|
return {_[1],_[2],_[3],_[4]}
|
||||||
|
--[[
|
||||||
|
{ "text", { {
|
||||||
|
tags = {},
|
||||||
|
text = "1"
|
||||||
|
}, {
|
||||||
|
tags = {},
|
||||||
|
text = "2"
|
||||||
|
} } }
|
||||||
|
{ "text", { {
|
||||||
|
tags = {},
|
||||||
|
text = "1"
|
||||||
|
}, {
|
||||||
|
tags = {},
|
||||||
|
text = "2"
|
||||||
|
} } }
|
||||||
|
{ "text", { {
|
||||||
|
tags = {},
|
||||||
|
text = "2"
|
||||||
|
} } }
|
||||||
|
{ "return" }
|
||||||
|
]]--
|
||||||
|
|
@ -17,24 +17,24 @@ _[41]={}
|
||||||
_[40]={}
|
_[40]={}
|
||||||
_[39]={}
|
_[39]={}
|
||||||
_[38]={}
|
_[38]={}
|
||||||
_[37]={text="8",tags=_[55]}
|
_[37]={tags=_[55],text="8"}
|
||||||
_[36]={text="8: ",tags=_[54]}
|
_[36]={tags=_[54],text="8: "}
|
||||||
_[35]={text="7",tags=_[53]}
|
_[35]={tags=_[53],text="7"}
|
||||||
_[34]={text="7: ",tags=_[52]}
|
_[34]={tags=_[52],text="7: "}
|
||||||
_[33]={text="13",tags=_[51]}
|
_[33]={tags=_[51],text="13"}
|
||||||
_[32]={text="13: ",tags=_[50]}
|
_[32]={tags=_[50],text="13: "}
|
||||||
_[31]={text="5",tags=_[49]}
|
_[31]={tags=_[49],text="5"}
|
||||||
_[30]={text="5: ",tags=_[48]}
|
_[30]={tags=_[48],text="5: "}
|
||||||
_[29]={text="4",tags=_[47]}
|
_[29]={tags=_[47],text="4"}
|
||||||
_[28]={text="4: ",tags=_[46]}
|
_[28]={tags=_[46],text="4: "}
|
||||||
_[27]={text="4",tags=_[45]}
|
_[27]={tags=_[45],text="4"}
|
||||||
_[26]={text="4: ",tags=_[44]}
|
_[26]={tags=_[44],text="4: "}
|
||||||
_[25]={text="5",tags=_[43]}
|
_[25]={tags=_[43],text="5"}
|
||||||
_[24]={text="5: ",tags=_[42]}
|
_[24]={tags=_[42],text="5: "}
|
||||||
_[23]={text="3",tags=_[41]}
|
_[23]={tags=_[41],text="3"}
|
||||||
_[22]={text="3: ",tags=_[40]}
|
_[22]={tags=_[40],text="3: "}
|
||||||
_[21]={text="3",tags=_[39]}
|
_[21]={tags=_[39],text="3"}
|
||||||
_[20]={text="3: ",tags=_[38]}
|
_[20]={tags=_[38],text="3: "}
|
||||||
_[19]={_[36],_[37]}
|
_[19]={_[36],_[37]}
|
||||||
_[18]={_[34],_[35]}
|
_[18]={_[34],_[35]}
|
||||||
_[17]={_[32],_[33]}
|
_[17]={_[32],_[33]}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue