Print

Print


It sounds like you may be using ADFs in a way for which they were not 
intended.  ECJ follows the Koza-style ADF mechanism, which is this:

A *caller* tree has in its function set an *ADF* node which can have 
some N number of children.  When the caller wishes to call the callee, 
it evaluates these children, then passes their results to the ADF node, 
which transfers them to the callee tree.

The *callee* tree is then evaluated.  The callee tree has in its 
function set N *ADFArgument* terminal nodes.  Each of these ADFArgument 
nodes, when evaluated, simply returns the value of one of those 
arguments provided by the caller tree.

The callee then finishes evaluation, returning a value.  Control reverts 
to the caller tree, and this value is then returned by the ADF node in 
the caller tree.

A variant called ADMs makes this a lazy process: the caller's children 
are only evaluated (and repeatedly evaluated) whenever the ADFArgument 
in the callee is evaluated.

It sounds like you're trying to use ADFArgument where you had meant to 
use ADF, but it's not quite clear.

Sean

Eric B wrote:
> Hello, I couldn't find anything about this (important) subject in the archives.
> 
> My problem is that I want to use an ADF with a single argument and that
> argument should not be a terminal but a function; i.e. a subtree. I'm sure
> ECJ has this functionality. However, I've been trying for half a day now
> without succes.
> 
> The problem, as far as I understand it, is hardcoded into ECJ. More
> specifically in the class ADFArgument:
>  // make sure we don't have any children...
>         if (children.length!= 0) 
>             state.output.error("Incorrect number of children for ADF
> Argument terminal -- should be 0.  Check the constraints.",base,def);
> 
> These lines of code checks whether the argument has 0 children, i.e. it
> checks whether the argument is a terminal. I've tried removing these lines
> of code however I run into other problems.
> 
> 
> Anyone can help me?
> 
> 
> Best regards,
> Eric.