mirror of
https://github.com/Reuh/anselme.git
synced 2025-10-27 16:49:31 +00:00
[language] automatically call text when they appear directly as a statement; remove autocalling of every text returned by a statement
The previous behavior, where any Text value returned by a line in a Block would be automatically called, may lead to unexpected Text event being written as it is not obvious which line can return a Text value after evaluation. The new behavior only triggers if a Text node directly appear in the original script as a statement.
This commit is contained in:
parent
991f9fed35
commit
b534a3c4a2
21 changed files with 80 additions and 40 deletions
|
|
@ -1,5 +1,5 @@
|
||||||
local ast = require("anselme.ast")
|
local ast = require("anselme.ast")
|
||||||
local Nil, Return, AutoCall, ArgumentTuple, Flush
|
local Nil, Return, Flush
|
||||||
|
|
||||||
local resume_manager = require("anselme.state.resume_manager")
|
local resume_manager = require("anselme.state.resume_manager")
|
||||||
|
|
||||||
|
|
@ -43,10 +43,7 @@ local Block = ast.abstract.Node {
|
||||||
for _, e in ipairs(self.expressions) do
|
for _, e in ipairs(self.expressions) do
|
||||||
if e:contains_resume_target(target) then resumed = true end
|
if e:contains_resume_target(target) then resumed = true end
|
||||||
if resumed then
|
if resumed then
|
||||||
r = e:eval(state)
|
r = e:eval_statement(state)
|
||||||
if AutoCall:issub(r) then
|
|
||||||
r = r:call(state, ArgumentTuple:new())
|
|
||||||
end
|
|
||||||
if Return:is(r) then
|
if Return:is(r) then
|
||||||
break -- pass on to parent block until we reach a function boundary
|
break -- pass on to parent block until we reach a function boundary
|
||||||
end
|
end
|
||||||
|
|
@ -54,10 +51,7 @@ local Block = ast.abstract.Node {
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
for _, e in ipairs(self.expressions) do
|
for _, e in ipairs(self.expressions) do
|
||||||
r = e:eval(state)
|
r = e:eval_statement(state)
|
||||||
if AutoCall:issub(r) then
|
|
||||||
r = r:call(state, ArgumentTuple:new())
|
|
||||||
end
|
|
||||||
if Return:is(r) then
|
if Return:is(r) then
|
||||||
break -- pass on to parent block until we reach a function boundary
|
break -- pass on to parent block until we reach a function boundary
|
||||||
end
|
end
|
||||||
|
|
@ -69,6 +63,6 @@ local Block = ast.abstract.Node {
|
||||||
}
|
}
|
||||||
|
|
||||||
package.loaded[...] = Block
|
package.loaded[...] = Block
|
||||||
Nil, Return, AutoCall, ArgumentTuple, Flush = ast.Nil, ast.Return, ast.abstract.AutoCall, ast.ArgumentTuple, ast.Flush
|
Nil, Return, Flush = ast.Nil, ast.Return, ast.Flush
|
||||||
|
|
||||||
return Block
|
return Block
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
local ast = require("anselme.ast")
|
local ast = require("anselme.ast")
|
||||||
local AutoCall, Event, Runtime = ast.abstract.AutoCall, ast.abstract.Event, ast.abstract.Runtime
|
local Event, Runtime = ast.abstract.Event, ast.abstract.Runtime
|
||||||
|
local ArgumentTuple
|
||||||
|
|
||||||
return Runtime(AutoCall, Event) {
|
local Text = Runtime(Event) {
|
||||||
type = "text",
|
type = "text",
|
||||||
|
|
||||||
list = nil, -- { { String, tag Table }, ... }
|
list = nil, -- { { String, tag Table }, ... }
|
||||||
|
|
@ -28,9 +29,19 @@ return Runtime(AutoCall, Event) {
|
||||||
return ("| %s |"):format(table.concat(t, " "))
|
return ("| %s |"):format(table.concat(t, " "))
|
||||||
end,
|
end,
|
||||||
|
|
||||||
|
-- autocall when used directly as a statement
|
||||||
|
eval_statement = function(self, state)
|
||||||
|
return self:call(state, ArgumentTuple:new())
|
||||||
|
end,
|
||||||
|
|
||||||
-- Text comes from TextInterpolation which already evals the contents
|
-- Text comes from TextInterpolation which already evals the contents
|
||||||
|
|
||||||
to_event_data = function(self)
|
to_event_data = function(self)
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
}
|
}
|
||||||
|
|
||||||
|
package.loaded[...] = Text
|
||||||
|
ArgumentTuple = ast.ArgumentTuple
|
||||||
|
|
||||||
|
return Text
|
||||||
|
|
|
||||||
|
|
@ -42,6 +42,10 @@ local Translatable = ast.abstract.Node {
|
||||||
_eval = function(self, state)
|
_eval = function(self, state)
|
||||||
return translation_manager:eval(state, self.context, self)
|
return translation_manager:eval(state, self.context, self)
|
||||||
end,
|
end,
|
||||||
|
-- pass on eval_statement state to the translated node
|
||||||
|
eval_statement = function(self, state)
|
||||||
|
return translation_manager:eval(state, self.context, self):eval_statement(state)
|
||||||
|
end,
|
||||||
|
|
||||||
list_translatable = function(self, t)
|
list_translatable = function(self, t)
|
||||||
t = t or {}
|
t = t or {}
|
||||||
|
|
|
||||||
|
|
@ -1,8 +0,0 @@
|
||||||
-- called automatically when returned by one of the expression in a block
|
|
||||||
|
|
||||||
local ast = require("anselme.ast")
|
|
||||||
|
|
||||||
return ast.abstract.Node {
|
|
||||||
type = "auto call",
|
|
||||||
init = false
|
|
||||||
}
|
|
||||||
|
|
@ -106,6 +106,11 @@ Node = class {
|
||||||
error(format_error(state, self, r), 0)
|
error(format_error(state, self, r), 0)
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
|
-- same as eval but called on the top node of a statement (i.e. a line of a block)
|
||||||
|
-- redefine if the statement behavior should be different
|
||||||
|
eval_statement = function(self, state)
|
||||||
|
return self:eval(state)
|
||||||
|
end,
|
||||||
_evaluated = false, -- if true, node is assumed to be already evaluated and :eval will be the identity function
|
_evaluated = false, -- if true, node is assumed to be already evaluated and :eval will be the identity function
|
||||||
-- evaluate this node and return the result
|
-- evaluate this node and return the result
|
||||||
-- by default assume the node can't be evaluated further and return itself; redefine for everything else, probably
|
-- by default assume the node can't be evaluated further and return itself; redefine for everything else, probably
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
local class = require("anselme.lib.class")
|
local class = require("anselme.lib.class")
|
||||||
|
|
||||||
local ast = require("anselme.ast")
|
local ast = require("anselme.ast")
|
||||||
local Table, Identifier
|
local Table, Identifier, Translatable
|
||||||
|
|
||||||
local translations_identifier, translations_symbol
|
local translations_identifier, translations_symbol
|
||||||
|
|
||||||
|
|
@ -65,12 +65,16 @@ local translation_manager = class {
|
||||||
end
|
end
|
||||||
|
|
||||||
-- no matching translation
|
-- no matching translation
|
||||||
return original.expression:eval(state)
|
if Translatable:is(original) then
|
||||||
|
return original.expression:eval(state)
|
||||||
|
else
|
||||||
|
return original:eval(state)
|
||||||
|
end
|
||||||
end,
|
end,
|
||||||
}
|
}
|
||||||
|
|
||||||
package.loaded[...] = translation_manager
|
package.loaded[...] = translation_manager
|
||||||
Table, Identifier = ast.Table, ast.Identifier
|
Table, Identifier, Translatable = ast.Table, ast.Identifier, ast.Translatable
|
||||||
|
|
||||||
translations_identifier = Identifier:new("_translations") -- Table of { Translatable = Table{ Struct context = translated node, ... }, ... }
|
translations_identifier = Identifier:new("_translations") -- Table of { Translatable = Table{ Struct context = translated node, ... }, ... }
|
||||||
translations_symbol = translations_identifier:to_symbol()
|
translations_symbol = translations_identifier:to_symbol()
|
||||||
|
|
|
||||||
11
test/results/autocall text statement.ans
Normal file
11
test/results/autocall text statement.ans
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
--# run #--
|
||||||
|
--- text ---
|
||||||
|
| {}"Hello" |
|
||||||
|
--- text ---
|
||||||
|
| {}"Hello" |
|
||||||
|
--- text ---
|
||||||
|
| {}"Wor" {}"ld" |
|
||||||
|
--- return ---
|
||||||
|
()
|
||||||
|
--# saved #--
|
||||||
|
{}
|
||||||
7
test/tests/autocall text statement.ans
Normal file
7
test/tests/autocall text statement.ans
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
| Hello
|
||||||
|
|
||||||
|
| Wor | + | ld |
|
||||||
|
|
||||||
|
(| Hello)!
|
||||||
|
|
||||||
|
(| Wor | + | ld |)!
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
:@choice=1
|
:@choice=1
|
||||||
|
|
||||||
:$ jump button
|
:$ jump button
|
||||||
1 # |A
|
1 #
|
||||||
|
|A
|
||||||
*| Suprise choice!
|
*| Suprise choice!
|
||||||
()
|
()
|
||||||
return("JOIN")
|
return("JOIN")
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
:@choice=1
|
:@choice=1
|
||||||
|
|
||||||
:$ jump button
|
:$ jump button
|
||||||
1 # | a
|
1 #
|
||||||
|
| a
|
||||||
|
|
||||||
return("SPLIT")
|
return("SPLIT")
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,8 @@
|
||||||
return(1 # | A)
|
return(1 # | A)
|
||||||
|
|
||||||
:$ move axis
|
:$ move axis
|
||||||
1 # | left
|
1 #
|
||||||
|
| left
|
||||||
return(" joystick")
|
return(" joystick")
|
||||||
|
|
||||||
*| Press {jump button!} to jump.
|
*| Press {jump button!} to jump.
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
if((), $|ko)
|
if((), $|ko|!)
|
||||||
if(1, $|ok)
|
if(1, $|ok|!)
|
||||||
if(1, $|ok bis)
|
if(1, $|ok bis|!)
|
||||||
|
|
@ -4,7 +4,8 @@
|
||||||
if(1, $()("x":"x" # _))
|
if(1, $()("x":"x" # _))
|
||||||
"b":"b" #
|
"b":"b" #
|
||||||
#p!checkpoint($_)
|
#p!checkpoint($_)
|
||||||
"c":"c"# |b
|
"c":"c"#
|
||||||
|
|b
|
||||||
|
|
||||||
|c
|
|c
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
1 #
|
1 #
|
||||||
|foo
|
|foo
|
||||||
if(1, $()("b":[1,2] # _))
|
if(1, $()("b":[1,2] # _))
|
||||||
if(1, $()("a":[2,3] # | bar))
|
if(1, $()("a":[2,3] # | bar |!))
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
1 #
|
1 #
|
||||||
| foo
|
| foo
|
||||||
"a":[2,3] # | bar
|
"a":[2,3] #
|
||||||
|
| bar
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
:$ f
|
:$ f
|
||||||
1 # | lol
|
1 #
|
||||||
|
| lol
|
||||||
|
|
||||||
return(2 # |d)
|
return(2 # |d)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,4 +2,4 @@
|
||||||
|
|
||||||
:b = ("b":"c" # | world and { "x":"y" # |friends })
|
:b = ("b":"c" # | world and { "x":"y" # |friends })
|
||||||
|
|
||||||
a+b
|
(a+b)!
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,14 @@
|
||||||
:@choice = 1
|
:@choice = 1
|
||||||
|
|
||||||
:$ jump button
|
:$ jump button
|
||||||
1 # | A
|
1 #
|
||||||
|
| A
|
||||||
*| Surprise choice!
|
*| Surprise choice!
|
||||||
| ok
|
| ok
|
||||||
|
|
||||||
:$ move axis
|
:$ move axis
|
||||||
1 # | left
|
1 #
|
||||||
|
| left
|
||||||
*| Surprise choice!
|
*| Surprise choice!
|
||||||
| ok2
|
| ok2
|
||||||
return(" joystick")
|
return(" joystick")
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,12 @@
|
||||||
:$ jump button
|
:$ jump button
|
||||||
1 # | A
|
1 #
|
||||||
|
| A
|
||||||
|
|
||||||
return!
|
return!
|
||||||
|
|
||||||
:$ move axis
|
:$ move axis
|
||||||
1 # | left
|
1 #
|
||||||
|
| left
|
||||||
|
|
||||||
return(" joystick")
|
return(" joystick")
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,8 @@
|
||||||
return(1 # | A)
|
return(1 # | A)
|
||||||
|
|
||||||
:$ move axis
|
:$ move axis
|
||||||
2 # | left
|
2 #
|
||||||
|
| left
|
||||||
return(" joystick")
|
return(" joystick")
|
||||||
|
|
||||||
| Press {jump button!} to jump.
|
| Press {jump button!} to jump.
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
: x = "x"!script($_)
|
: x = "x"!script($_)
|
||||||
|a
|
|a
|
||||||
if(run == 0, $|seen only once)
|
if(run == 0)
|
||||||
|
|seen only once
|
||||||
|b
|
|b
|
||||||
|
|
||||||
x!
|
x!
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue