As we all know, nim seperates the procedures that operate on an object from the 
data of the object itself. I understand the thinking and largely agree with it.

However, a side-effect of this is that when importing an object from a module, 
it is difficult to control what is being imported. Such control is useful, IMO, 
not because of avoiding name conflicts (though that is nice also); but avoiding 
blanket imports makes debugging faster and easier. It makes a visual scan of 
the code much more obvious from any context, even from dead-tree paper 
printouts.

For example, if someone showed me the following code because they had problem 
with x:
    
    
    import a_package
    import b_package
    
    
    var x = Joe()
    x.something()
    

All I know is that Joe is a class from _somewhere_. I now get to do a 
hunt-and-find exercise. Or I need to get myself to a computer, install the 
packages and source, and look at it with a nim-enabled editor.

Alternatively, the imports could have been:
    
    
    import a_package as a
    from b_package import nil
    

The user would then prefix everything with the module name or alias. This 
totally works, but it get very tedious the bigger the program becomes.

Another alternative is:
    
    
    from a_package import Joe, something, something_else, ...........
    

This also works, but if Joe has 50 methods, then I either import everything as 
a huge dump. Or, I import just what I need and keeping adding/removing stuff as 
needed. Again, tedious, but it works.

**My suggestion: add an indicator to do well defined import of an object and 
any associated methods found.**

So:
    
    
    from a_package import @Joe
    

or perhaps
    
    
    from a_package import Joe.*
    

The key here is to providing the compiler a way to automatically import both 
Joe and any non-generic method or proc in the form of "method SSSS*(self: Joe, 
...". In other words, is it a wild card that finds any proc who's first 
parameter is the designated class and conforms to UFCS usage.

So, the example program would become:
    
    
    from a_package import @Joe, @Larry
    from b_package import process_y, @ZZ
    
    
    var x = Joe()
    x.something()
    

Now I know exactly where Joe came from by just looking at it.

While, I'm still a newbie with nim, I've been doing Python programming for six 
years. I've come to appreciate the Python communities dislike of "from X import 
* " (they equivalent of "import X" in nim.) It has saved me countless headache 
over the years. Ironically, my background before that was in C/C++ and other 
languages that embrace such open imports.

I suspect, if something like this were implemented, much of the nim community 
would also eventually use such a feature as a default way of doing things.

Thoughts?

Reply via email to