On Tue, 23 Nov 2010 11:02:19 +0100, spir wrote:
> On Tue, 23 Nov 2010 04:44:51 +0800
> KennyTM~ <[email protected]> wrote:
>
>> On Nov 23, 10 04:38, spir wrote:
>> > On Mon, 22 Nov 2010 13:28:51 -0600
>> > Andrei Alexandrescu<[email protected]> 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.
Best,
Graham