www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - Import in functions

reply Vathix <chris dprogramming.com> writes:
It would be nice if we could import in functions, especially when  
inserting debug code.


void foo(int val)
{
    import std.stdio;
    writefln("DEBUG: val = %d", val);
}


One particularly nice use for this is when using unittests. Often times  
you want to import something just for a unittest but don't want it  
imported otherwise. Currently, we use version() or debug() to do that. It  
would be a whole lot simpler to just import right in the unittest.


Possible issues:


for(import std.string;;)
{
    // ...
}

for(;; import std.string, i++)
{
    // ...
}
Jun 20 2005
parent reply "Unknown W. Brackets" <unknown simplemachines.org> writes:
I don't like it in functions, myself, because it just makes things 
harder to read - although, I suppose, that's not the language's choice 
to enforce.  Still, it wouldn't work in C either.

I do very much like it in unittests, though, myself.  Many times, you'll 
want writef for the unittest (e.g. to explain *what* failed, better than 
assert can) but you won't need std.stdio for the general (no unittest) case.

That said, it's not like it's linked in anyway (or I should hope not!), 
so it's not that huge of a deal.  I guess the module constructors/etc. 
would be called, though?

-[Unknown]


 It would be nice if we could import in functions, especially when  
 inserting debug code.
 
 
 void foo(int val)
 {
    import std.stdio;
    writefln("DEBUG: val = %d", val);
 }
 
 
 One particularly nice use for this is when using unittests. Often times  
 you want to import something just for a unittest but don't want it  
 imported otherwise. Currently, we use version() or debug() to do that. 
 It  would be a whole lot simpler to just import right in the unittest.
 
 
 Possible issues:
 
 
 for(import std.string;;)
 {
    // ...
 }
 
 for(;; import std.string, i++)
 {
    // ...
 }

Jun 20 2005
parent Derek Parnell <derek psych.ward> writes:
On Mon, 20 Jun 2005 03:22:46 -0700, Unknown W. Brackets wrote:

 I do very much like it in unittests, though, myself.  Many times, you'll 
 want writef for the unittest (e.g. to explain *what* failed, better than 
 assert can) but you won't need std.stdio for the general (no unittest) case.

Yes. assert() tells you what the result is *not*, and not what the result is. I get around this limitation by using the debug statement. <code> debug private import std.stdio; int doubleit(int x) { return 2 + x; } unittest { debug writefln("%d", doubleit(1)); assert( doubleit(1) == 2); } void main() { } </code> I know its not perfect but it's not too much imposition for me. -- Derek Parnell Melbourne, Australia 20/06/2005 9:26:45 PM
Jun 20 2005