Inline imports redivivus

Zach Tollen zach at mystic.yeah
Sat Mar 12 06:46:52 UTC 2022


Thanks for your reply!

On Friday, 11 March 2022 at 13:01:43 UTC, Ali Çehreli wrote:
> On 3/10/22 22:48, Zach Tollen wrote:
> > ::std.datetime:SysTime          // if we put the `::` first
> it becomes
> > viable
> >                                  // it's a different version
> of the `$`
> >
>
> Perhaps a second meaning for ..? And is : really necessary? So, 
> would the following work?
>
>   ..std.datetime.Systime

If you used `..` here you would always have to add whitespace in 
an ordinary call chain, to avoid ambiguous lexing, so it's not 
good:
```d
{
    x = normal.call.chain;
    x = dotdot.call. ..modname:chain; // space necessary to avoid 
lexing as `...`
}
```

As far as not wanting to use `:` the issue is also ambiguity. In 
DIP1005, written a few years ago by Andrei Alexandrescu, this 
exact question was addressed [1]. Quote:
```d
void process(import.std.stdio.File input);
struct Buffered(Range) if (import.std.range.isInputRange!Range)
{
     ...
}
```
"Such an option has an ambiguity problem shown by Timon Gehr: is 
import.std.range.isInputRange looking up symbol isInputRange in 
module/package std.range, or the symbol range.isInputRange (e.g. 
a struct member) in module/package std?"

> - Single dot already means "this module".
> - Two dots may mean "outside of this module".

If we can find a starting token (other than `$`) which allows the 
construct to seem familiar and which has no other problems, I'm 
all for it. `::` has been suggested. I believe also `:` would 
work:
```d
auto x = :std.datetime:Systime;
```
Technically, `:` would not cause grammatical ambiguity. But I 
don't think it's visually distinct enough, and the error messages 
you get if you don't type it correctly would be confused with the 
compiler's other error messages for `:` syntaxes.

At minimum, `$` as in `$fully.qualified:symbol` announces its 
presence boldly, as if to challenge the language designer to come 
up with a better use of the `$` token. :-)

> Going off topic and without knowing whether this topic has 
> already been brought up, should inline imports automatically be 
> made available to the callers of functions? Arbitrarily using 
> the $ syntax:
>
> module my.module;
>
> void foo($bar:SomeSymbol a) {
> }
>
> Since 'foo' is public to the users of my.module, should we 
> expect the users be able to call 'foo' without importing 
> SomeSymbol separately themselves?

I would say no. As a one-use import, it doesn't spread its import 
anywhere but to itself. But the caller can just call using 
`foo($bar:SomeSymbol(value))` if they don't feel like importing 
the module either.

> And the next question may be what if SomeSymbol is accessible 
> to my.module but not to my users (e.g. if it's 'package'). So, 
> if it should automatically be imported for the users, should 
> SomeSymbol automatically be raised to 'public' status for the 
> users of 'foo'?

Again, no. If a function parameter requires a privately defined 
structure, then that function is not meant to be called by things 
which don't have access to that structure.

Inline imports are semantically no different from symbols which 
had their modules imported separately. I'm pretty sure issues of 
privacy won't be affected by this.

- Zach

[1] 
https://github.com/dlang/DIPs/blob/master/DIPs/other/DIP1005.md#syntactic-alternatives


More information about the Digitalmars-d mailing list