On 12/13/10 06:55, Dennis Wassel wrote:
> Hi Bruce, hi list,
>
> FYI a small gotcha I stumbled over today:
>
> Suppose I have a template file that produces both foo.c and foo.h, and says
>
> #include "[+ (. header-file) +]"
>
> somewhere. This will nicely expand to
> #include "foo.h"
> in the usual cases. If I issue --select-suffix=c though, because I do
> not want to regenerate foo.h right now, it expands to
> #include "/dev/null"
> which is pretty irritating (and betrays the option's implementation :)
Don't do that. ;-) I confess, when writing the option templates
I only really considered --select-suffix=h. But you are correct.
It is a template bug to have the "c" suffix code presume that the
"h" suffix code has run and left behind a scheme variable for it
to use.
> A workaround is to use
>
> #include "[+ (string-substitute (out-name) ".c" ".h") +]"
#include "[= (base-name) =].h"
since the option templates append the suffixes to the base name.
Each template needs to solve the problem for itself.
> instead.
> I am not saying this is a bug that needs fixing, but IMO it does
> somewhat violate the "least-surprise" principle.
Only ever use --select-suffix=h like I expected you to. :-D
Regards, Bruce
P.S. I held my email while looking through the use of the "header-file"
scheme variable. I've concluded that it is a difficult implementation
problem to say that these options are viable for all templates.
Templates are, by their nature, highly state-ful. The template author
is, therefore, required to say whether or not a particular suffix
is optional or required. In the case of a template that emits
#include "/dev/null"
into a .c file in the absence of emitting the .h file, then emitting
the .h is required for emitting the .c. As noted, though, fixing
this one is quite simple. That is *not* the case with the options
template. I construct a number of hash tables during the header
generation that are required to be there for the code generation.
So, I consider this an RFE for annotating the pseudo macro with
something that says, "this suffix is optional" and suffixes are required
by default. Someday. Not today. :)
Syntax suggestion: append a '?' character to the end of the suffix.
The character gets stripped and the suffix gets marked as "optional".
|