Re: Re: Reworking import statements (proposal)
som-snytt <[email protected]> Thu, 14 Apr 2016 14:40:07 -0700 (PDT)
| Newsgroups | gmane.comp.lang.scala |
|---|---|
| Message-ID | <[email protected]> |
I would like to see syntax which helps me understand what a relative import is relative to. I think the underscore syntax could help. import com.acme, _.util.Stuff If the underscore means, this import is relative to a name introduced previously in this import statement, then I've learned something. In particular, util cannot accidentally refer to some earlier imported identifier. Currently, we would write import com.acme._, util.Stuff // on one or two lines, but which package has a util subpackage? I don't think `import _.util.Stuff` by itself tells me anything I didn't already know. It would be totally great if 2016 introduced another use for underscore. Because it makes you realize the possibilities are endless. On Thursday, April 14, 2016 at 2:05:39 PM UTC-7, martin wrote: > > Here's a radically simplifying proposal: Let's only have relative > imports! Oh wait, Scala already does that ;-). > > In seriousness, Scala has a very simple model of name resolution and I > intend to keep it that way. Scopes are nested, packages are scopes, > and every name resolution goes inside out. What could be simpler? > > Best, > > - Martin > > On Thu, Apr 14, 2016 at 6:39 PM, Piotr Tarsa <[email protected] > <javascript:>> wrote: > > > >> I don't see where relative imports are confusing. Can you give an > example? > >> Most people nowadays let package level imports manage by the IDE. > > > > > > Yes, IDE can be pretty good at organizing imports and convert all > imports to > > use the longest sensible path possible (ie not overusing _root_ prefix). > > However, this is limited to code we're editing, not the read-only (ie > not > > editable at the time of reading) code we're reading somewhere. > > > >> Imports in a smaller scope are mostly used as relative imports and they > >> are written manually. Prefixing them with something results in more > typing - > >> therefore hardly an improvement. > > > > > > A little more typing :) I'm more concerned about readability. Prefixing > with > > '_.' or just '.' doesn't add serious amount of noise, but makes some > things > > clearer. > > > > Another thing is that with my proposal using relative imports would be > > somewhat discouraged and at the same time usual reformatting rules (in > > IntelliJ at least) replace relative imports with absolute ones. So no > big > > negative change for people not using relative imports (ie the vast > > majority). > > > >> Can you define "absolute" and "relative"? In both cases, the first word > >> after `import ` is simply an identifier that's in scope. > > > > > > Those definitions were invented ad-hoc, but the ad-hoc description could > be: > > absolute import works without any other imports while relative import > > requires some other import. That should be perfectly unambiguous for > > top-level imports (ie outside any {} parentheses), but I haven't thought > > much about lower level scopes. > > > > With my proposal there could be a rare case where some root package name > > clashes with some parameter/ field name in scope, thus making it > impossible > > to import directly from that root package without some renaming in > higher > > scope imports. Eg: > > > > import com.{sun => com_sun} // I can't do "import {com => comP}" as it > > doesn't compile > > def fun(com: Type) { > > import _.com_sun.whatever.i.need.Something > > import com._ // import from parameter > > // code here > > } > > > > Alternatively: > > > > import com._ > > def fun(com: Type) { > > import _.sun.whatever.i.need.Something > > import com._ > > // code here > > } > > > > Easiest way would be to just rename the parameter, but we could import > from > > some eg inherited field which could make renaming more laborious. > However, > > it's still manageable. In current situation we would need to use _root_ > > prefix anyway, which also isn't super nice. > > > > I'm not aware right now of any blocking problems with my proposal. > > > > > > Regards > > > > W dniu środa, 13 kwietnia 2016 13:02:21 UTC+2 użytkownik Piotr Tarsa > > napisał: > >> > >> Hi, > >> > >> As of now relative imports (ie importing from something already > imported) > >> look exactly the same as absolute ones (ie where we're importing using > full > >> paths), except when explicitly starting from _root_. That is both > confusing > >> (where I have relative or absolute import? it's not immediately > obvious) and > >> ugly (the _root_ prefix is ugly). > >> > >> My proposal is to change import statements semantics to make things > >> obvious: > >> > >> Current state: > >> import _root_.outer.inner.Member - for absolute imports (usually used > when > >> there are name clashes) > >> import outer.inner.Member - for absolute imports (usually used when > there > >> are no name clashes) > >> import inner.Member - for relative imports > >> import parameter.member - for importing from parameters > >> > >> Proposal for next Scala version: > >> import _root_.outer.inner.Member - deprecate _root_ prefix > >> import outer.inner.Member - leave as it is > >> import inner.Member - deprecate this form of relative imports > >> import _.inner.Member - introduce this syntax for relative imports > >> import parameter.member - leave as it is > >> > >> And a version after that: > >> import _root_.outer.inner.Member - drop support for _root_prefix > >> import outer.inner.Member - keep it > >> import inner.Member - drop support for this form of relative imports > >> import _.inner.Member - keep it > >> import parameter.member - keep it > >> > >> What do you think about it? > >> > >> Regards, > >> Piotr Tarsa > > > > -- > > You received this message because you are subscribed to the Google > Groups > > "scala-language" group. > > To unsubscribe from this group and stop receiving emails from it, send > an > > email to [email protected] <javascript:>. > > For more options, visit https://groups.google.com/d/optout. > > > > -- > > Martin Odersky > EPFL and Lightbend > -- You received this message because you are subscribed to the Google Groups "scala-language" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.