-
Notifications
You must be signed in to change notification settings - Fork 195
State and Continuation
Using state and continuation in Tinymoe is not a simple topic. So if you are interested in it, you should read:
Here we only introduce the syntax part of state and continuation.
If you have read Manipulating Functions, you may know that there is a special kind of functions called continuation. In order to touch the real state object and real continuation object, we introduce the cps for sentence and block.
- For sentences, the syntax is
cps (state) (continuation). - For blocks, the syntax is
cps (state).
The declaration introduces two new variables. You can read and write fields of them. But changing these variables to reference to a new object does not work.
state is a variable storing extra information of the control flow event that is happening. The type of state is always:
type continuation state
flag
argument
continuation
trap
end
For the trap field, its type is always:
type continuation trap
continuation
previous trap
end
If the current control flow event supports pause and resume, then the type of the argument field should be:
type continuation fall back argument
value
trap
fall back counter
end
Coroutine is one application of the pause and resume feature.
Details of trapping can be found in Standard Library: Trap.
Details of coroutine can be found in Standard Library: Coroutine.
When there is no happening control flow event, the flag, argument and continuation fields are all null. When there is, the flag field stores a value of symbol to specify the event name, and the values in argument and continuation depend on it.
If the continuation field is not null, it should be a continuation.
Continuations are only accessable in sentences with cps (state) (continuation). If the continuation field of the state variable is not null, then the original value should comes from a cps sentence.
Continuation means "the next step". That means, if the following code is executing:
cps (state) (continuation)
sentence do something
xxx
end
phrase main
set a to 1
do something
set b to 2
print a + b
end
When the running code reaches xxx, then calling the continuation means executing
set b to 2
print a + b
You are know understand what is a continuation. Continuation means "the next step", which means "everything that is going to be happened after the current cps sentence finished".
If you get the state and continuation, you can implement any control flow that make sense. To do that, you should read:
Dealing with continuation is not difficult, but it is complicated. You should follow all rules that are described in the two links before. Standard library functions are always your first choice. You don't want to invent strange things. If you really want to invent your own pattern of using continuation, make sure that your code is compatible with those standard library things, like try-catch and coroutine.
You are suggested to use standard library functions for state and continuation, if possible.