SETTINGS *local_args = collect_arguments( rule, frame->args );
SETTINGS *local_args = collect_arguments( rule, frame );
evaluate_rule(    char    *rulename,    FRAME *frame ){    LIST      *result = L0;    RULE          *rule;    profile_frame prof[1];    module    *prev_module = frame->module;        LIST*  l = var_expand( L0, rulename, rulename+strlen(rulename), frame->args, 0 );    if ( !l )    {        printf( "warning: rulename %s expands to empty string\n", rulename );        return result;    }    if ( DEBUG_COMPILE )    {        debug_compile( 1, l->string );        lol_print( frame->args );        printf( "\n" );    }    rulename = l->string;    rule = bindrule( l->string, frame->module );    if ( rule->procedure && rule->procedure->module != prev_module )    {        /* propagate current module to nested rule invocations */        frame->module = rule->procedure->module;                /* swap variables */        exit_module( prev_module );        enter_module( rule->procedure->module );    }    list_free( l );        if ( DEBUG_PROFILE && rule->procedure )        profile_enter( rule->procedure->rulename, prof );    /* Check traditional targets $(<) and sources $(>) */    if( !rule->actions && !rule->procedure )        printf( "warning: unknown rule %s\n", rule->name );    /* If this rule will be executed for updating the targets */    /* then construct the action for make(). */    if( rule->actions )    {        TARGETS *t;        ACTION  *action;        /* The action is associated with this instance of this rule */        action = (ACTION *)malloc( sizeof( ACTION ) );        memset( (char *)action, '\0', sizeof( *action ) );        action->rule = rule;        action->targets = targetlist( (TARGETS *)0, lol_get( frame->args, 0 ) );        action->sources = targetlist( (TARGETS *)0, lol_get( frame->args, 1 ) );        /* Append this action to the actions of each target */        for( t = action->targets; t; t = t->next )            t->target->actions = actionlist( t->target->actions, action );    }    /* Now recursively compile any parse tree associated with this rule */    /* refer/free to ensure rule not freed during use */    if( rule->procedure )    {        SETTINGS *local_args = collect_arguments( rule, frame->args );        PARSE *parse = rule->procedure;        parse_refer( parse );                pushsettings( local_args );        result = (*parse->func)( parse, frame );        popsettings( local_args );                parse_free( parse );    }    if ( frame->module != prev_module )    {        exit_module( frame->module );        enter_module( prev_module );    }    if ( DEBUG_PROFILE && rule->procedure )        profile_exit( prof );    if( DEBUG_COMPILE )        debug_compile( -1, 0 );    return result;}