rdmd --main

spir denis.spir at gmail.com
Tue Nov 23 13:12:27 PST 2010


On Tue, 23 Nov 2010 14:43:57 +0000 (UTC)
Graham Fawcett <fawcett at uwindsor.ca> wrote:

> On Tue, 23 Nov 2010 11:02:19 +0100, spir wrote:
> 
> > On Tue, 23 Nov 2010 04:44:51 +0800
> > KennyTM~ <kennytm at gmail.com> wrote:
> > 
> >> On Nov 23, 10 04:38, spir wrote:
> >> > On Mon, 22 Nov 2010 13:28:51 -0600
> >> > Andrei Alexandrescu<SeeWebsiteForEmail at erdani.org>  wrote:
> >> >
> >> >> On 11/22/10 12:53 PM, spir wrote:
> >> >>> Hello,
> >> >>>
> >> >>>
> >> >>> The rdmd option --main is really helpful to test modules
> >> >>> independently (it adds an empty main() to prevent the linker from
> >> >>> crying). An issue is that each time we switch between .d files that
> >> >>> have no main() (modules in tended for export) and app files that
> >> >>> have one, this option must be set or removed (else the linker
> >> >>> complains for having 2 main()). This is not very practicle for
> >> >>> rapid edit-test cycles -- for "exploratory" programming in general.
> >> >>> Would it be difficult for rdmd to detect whether a main is already
> >> >>> present? It is not a big issue anyway -- just in case would be
> >> >>> easy.
> >> >>
> >> >> That feature could be added in several ways.
> >> >>
> >> >> 1. Cooperate with the compiler - have the compiler detect whether or
> >> >> not main() exists.
> >> >>
> >> >> 2. Write a tokenizer (parser is not really needed) and have it
> >> >> identify the occurrence of main with one of the appropriate
> >> >> signatures at top level.
> >> >>
> >> >> 3. Use compiler's json output.
> >> >>
> >> >> 4. Use a low-tech search such as sed to find main.
> >> >>
> >> >> I fear that 2-4 would slow things down and add complexity. Probably
> >> >> 1 would be the best choice. I'll ask Walter.
> >> >
> >> > Thank you for taking this into account. Indeed, asking the compiler
> >> > is the best solution, but may require some work and testing, I guess.
> >> > For a non-perfect solution (because would not work in 100% cases),
> >> > just detecting "\nint main" or "\nvoid main" in file would nearly
> >> > always work, don't you think? (Possibly adding some opt whitespace in
> >> > the pattern to catch even more cases.) Or are there issues I'm not
> >> > aware of. (Else, I would be happy with this, but it's only me.)
> >> >
> >> > Denis
> >> > -- -- -- -- -- -- --
> >> > vit esse estrany ☣
> >> >
> >> > spir.wikidot.com
> >> >
> >> >
> >> The issue is "not work in 100% cases" :)
> >> 
> >> class Tier {
> >>    private int mainValue;
> >>    private int secondaryValue;
> >>    int main(int factor) const { return mainValue * factor; } // ^
> >>    int secondary(int factor) const { return secondaryValue * factor; }
> >>    ...
> >> }
> > 
> > You are right, but this case would correctly not be caught (as long as
> > the search pattern does not allow free whitespace at start of main's
> > header line), because you properly indented the class's definition.
> > Something like (untested -- and I don't know yet D's regexes):
> > 	auto mainSearchPattern = r"^(int/void)[ \t]+main[ \t]*(";
> > Now, we cannot prevent anyone to write Hello, world as
> > 
> > // my first program in d
> > /////////////////////////////////////////////////////////////
> > 			               void main (){
> > /////////////////////////////////////////////////////////////
> > 	writeln("Hello, world!");}
> > 
> > What I imagine is (0) if no --main in cmdline, pass this phase, else (1)
> > read the (top/passed) module into a string (2) search for main() using a
> > paatern like this one (3) if not found, append "\nvoid main ()
> > {}\n".
> 
> Your plan doesn't account for compile-time programming. E.g.:
> 
>     mixin template addMain() {
>       import std.stdio;
>       void main() {
>         writeln("Your regex won't find me...");
>       }
>     }
> 
>     mixin addMain;
> 
> There are several other ways that "main" could be added in a
> non-literal way. In short, regexes are too brittle for this. The JSON
> output that Andrei mentioned is IMHO your best bet, until we get
> support from the compiler.

Right.

Denis
-- -- -- -- -- -- --
vit esse estrany ☣

spir.wikidot.com



More information about the Digitalmars-d mailing list