Liste des Groupes | Revenir à cl forth |
In article <vnkvvq$2a5o$1@dont-email.me>, Ruvim <ruvim.pinka@gmail.com> wrote:Recursion is not necessary. It is enough to use the same-name "local" variables in different functions, some of which throw exceptions, and other catch exceptions.On 2025-01-31 11:33, dxf wrote:Nice catch!>>
Not sure if previously mentioned but here's another version of LOCAL
>
: ;: >r ;
>
: LOCAL ( x adr -- )
r> -rot dup @ over 2>r ! ;: 2r> ! ;
>
variable A variable B 8 a ! 7 b !
>
: divide ( a b -- ) b local a local
a @ b @ / . cr ;
>
15 3 divide a ? b ?
>
>
This approach does not work well with catch/throw. Because `throw` must
restore the values of all "local" variables that are used in the
definitions whose execution is being terminated. And this is difficult
to implement.
>
>
See also 13.3.3.1, item c,
<https://forth-standard.org/standard/locals#subsubsection.13.3.3.1>
>
| ABORT shall release all local storage resources,
| and CATCH / THROW (if implemented) shall release
| such resources for all definitions whose execution
| is being terminated.
However, this is highly artificial. You have to have a recursive routine in this
vein:
RECURSIVE
: fun .. fun ... fun . 'fun CATCH .. fun ... ;
otherwise the global VARIABLE's can be ignored.
I would be interested to see a remotely plausible example of this.
Mixing recursion and exception is ill advised by iq<160.
Les messages affichés proviennent d'usenet.