Newbie questions about Pliant

Newbie questions about Pliant

Begin and End block

How do I automatically run some code in the beginning and end
of program ?
Message posted by maybe Boris Reitman on 2003/12/06 08:05:28
Perl has a BEGIN{} and END{} blocks to do initialization and cleanup.
This way a database interface module can automatically close any open connections.
Several BEGIN blocks are executed in the seen order (fifo), and
several END blocks in reverse (lifo).

How can I write a meta to do something like this ? 
Message posted by hubert.tonneau on 2003/12/06 12:11:40
Pliant has a single notion for initialisation and cleanups, and it is the function.

If you want to have per bloc initialisation and cleanups (as far as I understand
that you want these to append as side effect of per bloc local variables creation
and deletion), you either have to:
. do these explicitely. As an exemple, the Pliant 'Stream' data type will do
  'close' automatically at variable deletion time, but you can do it explicitely
  anywhere in the code
. write a complex meta that will scan for bloc local variables (as the code
  generation part of Pliant does for function local variables)

Also the idea of per bloc side effects is probably bad.
In the 60ths, Pascal had per function local functions, and these where abandonned
in C, because it's better to keep a function as a simple flat thing.

The general idea is that if you move to per bloc execution speed will slow down
because you will have temporary complex variables (such as strings) that will
be created and deleted in each loop instead of only once for the all function,
so you will loose more than you win because you will have to be more carefull
of what you don't see (complex temporary variables) if you want to get resonable
ferformances at the end with clean code (high level).
Message posted by maybe Boris Reitman on 2003/12/07 02:30:12
I need to destroy PerlInterpreter instance, but only after
all Perl* variables have gone through their destruction cycle.
So this means that I need to add this code to the end 
of the _main_ block.  How do I identify the main block
with a meta ?  Define a meta for '{' and check somehow that the expression
has no parents ?
Message posted by hubert.tonneau on 2003/12/07 02:51:49
One possibility might be, as far as I have understood your probem, to have
'PerlInterpreter' allocated with a 'new', and a link to it in each Perl variable,
so that references count will do the trick.

Another solution might be to use a code optimiser to add the creation and
destruction instructions of the 'PerlInterpreter'
Message posted by maybe pom on 2003/12/07 10:33:31
About the "BEGIN" statement, you may use the fact that modules
are executed "bloc by bloc" when they are loaded for the first time.
Thus, module initializations are quite easy to do.
For instance, if "mymodule.pli" contains
console "Hello world" eol
as its first line, the message "Hello world" will be prompted the first time
mymodule.pli will be accessed (thus loaded and executed).

Message posted by maybe Boris Reitman on 2003/12/07 11:17:04
Right, I could also use a module level 'destroy' which runs when modules are unloaded. I will try Hubert's suggestion with code optimizer.