1
0
Fork 0
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:
Étienne Fildadut 2021-12-04 18:51:09 +01:00
parent 6e5cbf9e7e
commit d5b1a9f225
6 changed files with 94 additions and 30 deletions

View file

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

View file

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

View file

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

View file

@ -0,0 +1,12 @@
$ fn
1
§ c
2
:c = &fn
~ c!
~ c()
~ c!

View 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" }
]]--

View file

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