Hi Rowan,

> On Aug 23, 2024, at 2:39 AM, Rowan Tommins [IMSoP] <imsop....@rwec.co.uk> 
> wrote:
> On 23 August 2024 00:15:19 BST, Mike Schinkel <m...@newclarity.net> wrote:
>> Having to prefix with a name like Foo, e.g. Foo\strlen() is FAR PREFERABLE 
>> to _\strlen() because at least it provides satiating information rather than 
>> the empty calories of a cryptic shorthand.  #jmtcw, anyway.
> 
> I knew I'd regret keeping the example short. Realistically, it's not a 
> substitute for "\Foo\strlen", it's a substitute for 
> "\AcmeComponents\SplineReticulator\Utilities\Text\strlen".

And similarly, I too regret keeping my answer short. I was assuming what I 
omitted would be obvious. 

(And I am not being snarky, I literally thought about including this next but 
then felt I did not need to. Hindsight!)

So, long namespaces is why PHP has the `use` statement, making references in 
functions short and sweet, e.g:

namespace \AcmeComponents\SplineReticulator\Utilities\Text
use \AcmeComponents\SplineReticulator\Utilities\Text

function Foo():int {
        return Text\strlen("Hello World");
}

(Of course, that is a lot of redundant boilerplate.)

> Another option would be to find a shorter keyword than "namespace" to put it 
> in front. "ns\strlen(...)" is an obvious step from what we have currently, 
> but it's not very obvious what it means, so maybe there's a different word we 
> could use.

So rather than all that boilerplate, and rather than yet another special set of 
characters developers would need to learn and remember — and tooling would need 
to adjust to — we could instead easily add an automatic `use` statement for 
every namespace, as long as no existing use statement conflicts with it. 

An automatic `use` would then give us the following, which provides a strong 
information sent and is really consistent with the nature of the PHP language:

namespace \AcmeComponents\SplineReticulator\Utilities\Text

function Foo():int {
        return Text\strlen("Hello World");
}

The above of course could result in BC breaks IF there happened to be existing 
code that referenced Text\strlen() where Text was a top-level namespace, AND 
that code was not remediated when this change takes place. However, I am 
guessing those collisions would be pretty rare as both the namespace and the 
symbol would have to match to be in conflict.

> Having a syntax for "relative to current" is incredibly common in other 
> path-like syntaxes. The most common marker is ".", and ".\foo" is literally 
> how you'd refer to something in the current directory under DOS/Windows. But 
> unfortunately, we don't have "." available, so I wondered if "_" would feel 
> similar enough.

I'll be honest, the association with the relative path of `.\` did not occur to 
me when you presented `_\` so after you stating this I pondered if from that 
perspective. 

However, frankly, I am not sold on that perspective. Something about it does 
not feel right. I can't currently give any more objective arguments than that, 
so I will just leave it as #jmctw.

I will say if we were going with relative path, I think `\\strlen()` would be 
preferable to `_\strlen()`. Subjectively `\\` is easier for me to "see" and 
thus does not look so out of place to me. 

OTOH the objective arguments for `\\` over `_\` are it is much easier to type:  
slash+slash vs. shift-underscore+nonshift-slash. There is a precedent in URIs 
with `//`, albeit not exactly equivalent. And finally, it also does not use a 
sigil that could be better used elsewhere in some as-yet-to be agreed or 
envisioned future use. #fwiw

-Mike

Reply via email to