The discussion is quite informative for me to read, thanks for responding. 
Go uses nil in a way which I don't quite yet grok, and so I had no idea if 
it was even a reasonable thing to wish for. Today I am writing in 
Typescript, and the way null is integrated into the type system now (after 
a while) feels natural and helpful to me.

Sam is correct, there is bug in my Go snippet in the post. For humor value 
only, I would like to point out that the imaginary Go compiler I was 
wishing for would have found that bug!

I think Brian gets to the heart of my question, which is "If I really 
understood Go, would I want something like this". I am hearing, "No, you 
would not"

I think if I were to have a long conversation with Axel about "what is it 
that makes programs robust and maintainable" we'd go round in circles a 
bit, as should happen any time you talk about something complex and 
important. I think I disagree with some statements, but even the 
disagreement is super helpful.

Thanks for the discussion!

-Michael Toy

On Thursday, March 24, 2022 at 12:22:44 AM UTC-10 Brian Candler wrote:

> The OP hasn't said specifically which language or feature they're 
> comparing with, but I wonder if they're asking for a pointer type which is 
> never allowed to be nil, enforced at compile time.  If so, a normal 
> pointer-which-may-be-nil would have to be represented as a Maybe[*T] or 
> union { *T | nil }. To use such a pointer value at runtime you'd have to 
> deconstruct it via a case statement or similar, with separate branches for 
> where the value is nil or not-nil. I am sure there have been proposals 
> along those lines floated here before.
>
> I don't think this would negatively affect code readability, because a 
> function which takes *T as an argument can be sure that the value passed in 
> can never be nil (the compiler would not allow a value of type Maybe[*T] to 
> be passed).  Conversely, a function which accepts Maybe[*T] as an argument 
> is explicitly saying that the value passed may legitimately be nil, and 
> hence it needs to check for this.
>
> I like this idea in principle, but in the context of Go it would mean that 
> *T does not have any valid zero value, so you would not be able to use it 
> in any variable or struct which is not explicitly initialized.  This would 
> definitely not be Go any more.
>
> type T ....
> var t T  // ok
>
> var p1 Maybe[*T]  // ok
> var p2 *T = &t  // ok
> var p3 *T  // fails to compile (no zero value is available)
>
> type A struct {
>     a Maybe[*T]
> }
> var q1 A // ok
>
> type B struct {
>     b *T
> }
> var q2 B = B{b: &t} // ok
> var q3 B  // fails to compile (cannot create zero-valued instance of this 
> struct, because it includes a member which cannot have a zero value)
>  
> On Thursday, 24 March 2022 at 09:41:23 UTC axel.wa...@googlemail.com 
> wrote:
>
>> One thing to be clear: It is very different if we are talking about "emit 
>> a warning if a value is known to be nil" and "emit a warning unless a 
>> warning is known not to be nil". The former seems fine to me - it is IMO 
>> fine for this code to cause a vet-failure:
>>
>> var x *int
>> y := *x
>>
>> What I'm opposing is the original idea, for this code to cause a 
>> vet-failure:
>>
>> func (x *int) { *x }
>>
>> Importantly, whether or not a value is `nil` is *always* going to be a 
>> heuristic <https://en.wikipedia.org/wiki/Halting_problem>.
>> If we complain about "known to be nil", every finding will always be a 
>> bug. I don't think it's objectionable to find them statically.
>> If we complain about "not known not to be nil", a significant number of 
>> findings will be non-bugs, leading to changes as OP suggested. So, I'm 
>> assuming that's the situation we are talking about.
>>
>> On Thu, Mar 24, 2022 at 9:40 AM Sam Hughes <sam.a....@gmail.com> wrote:
>>
>>> @axel, it my feel counter-intuitive, but a possible runtime panic 
>>> converted to a compiler error is an increase in how robust the code is.
>>>
>>
>> Of course. But that's not what we are talking about. We are converting 
>> *some* runtime bugs into compiler errors (really, vet checks, we can't fail 
>> to compile because of backwards compatibility).
>> But most of them, where it's not clear from the code that a particular 
>> pointer is going to be nil, will get the treatment suggested by OP. Which 
>> ends up exploding the state-space of possible behaviors of a program, 
>> making it exponentially harder to know what it's doing.
>>
>> That's IMO the less intuitive thing. People tend to think "crashing code 
>> is unreliable". But really, crashing is quite a safe and easy to reason 
>> about behavior. But having to constantly program against any possible bug 
>> leads to unmaintainable, brittle, impossible to reason about code. If every 
>> index-expression, every pointer-dereference and every method call needs to 
>> be wrapped in a conditional, it becomes impossible to really understand 
>> where a failure is coming from and how a program behaves in different 
>> failure modes.
>>
>> The weird part, at least, why it might feel weird, is that you might 
>>> never encounter the issue as a runtime panic, but as a compiler error, it 
>>> will hit you every time. This will make exploring and experimenting with 
>>> unfamiliar imports, features, and patterns more complicated, but it is the 
>>> entire point, to my mind, of having a type-system.
>>>
>>> P.S. Bug in the snippet given by OP? I expected to see "x != nil" 
>>> instead of "x == nil", or else change comments around.
>>>
>>>
>>> On Wednesday, March 23, 2022 at 4:15:13 PM UTC-5 
>>> axel.wa...@googlemail.com wrote:
>>>
>>>> Personally, I think this leads to very unreadable code, for no real 
>>>> benefit.
>>>> If a nil-pointer dereference happens unexpectedly, that's always a bug. 
>>>> A panic is the correct signal to tell me about that bug, so I can go ahead 
>>>> and fix it. So, making my code less readable to get less robust code seems 
>>>> like a lose-lose proposition to me.
>>>>
>>>> Of course, people can always choose to write/use whatever static 
>>>> checker they want. I'm not opposed to this existing. I just don't think it 
>>>> should be in the compiler or in `go vet`.
>>>>
>>>> On Wed, Mar 23, 2022 at 10:01 PM 'Michael Toy' via golang-nuts <
>>>> golan...@googlegroups.com> wrote:
>>>>
>>>>> I barely understand Go, so this is likely a stupid idea. Since Go uses 
>>>>> nil for a lot of things, lots of things can be nil.
>>>>>
>>>>> I am not a huge fan of the null safe accessor. ( 
>>>>> https://github.com/golang/go/issues/42847 )
>>>>>
>>>>> I am a huge fan of the compiler telling me the places where I have not 
>>>>> checked for nil ... It took me a while to get used to languages which do 
>>>>> this, but now I can't imagine living without it.
>>>>>
>>>>> Is it crazy to wish for ...
>>>>>
>>>>> if x == nil {
>>>>>   // this does not produce an error because x is known not to be nil
>>>>>   x.interfaceFunc()
>>>>> }
>>>>> // this DOES produce an error/warning if y is possibly nil
>>>>> y.interfaceFunc()
>>>>>
>>>>> -- 
>>>>> You received this message because you are subscribed to the Google 
>>>>> Groups "golang-nuts" group.
>>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>>> an email to golang-nuts...@googlegroups.com.
>>>>> To view this discussion on the web visit 
>>>>> https://groups.google.com/d/msgid/golang-nuts/5a700cd9-9274-4756-80a6-9d322232afebn%40googlegroups.com
>>>>>  
>>>>> <https://groups.google.com/d/msgid/golang-nuts/5a700cd9-9274-4756-80a6-9d322232afebn%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>> .
>>>>>
>>>> -- 
>>> You received this message because you are subscribed to the Google 
>>> Groups "golang-nuts" group.
>>> To unsubscribe from this group and stop receiving emails from it, send 
>>> an email to golang-nuts...@googlegroups.com.
>>>
>> To view this discussion on the web visit 
>>> https://groups.google.com/d/msgid/golang-nuts/14f6ade8-fe5b-4876-b692-ed98764eaa55n%40googlegroups.com
>>>  
>>> <https://groups.google.com/d/msgid/golang-nuts/14f6ade8-fe5b-4876-b692-ed98764eaa55n%40googlegroups.com?utm_medium=email&utm_source=footer>
>>> .
>>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/4bf6c7d8-3970-4065-b0b6-62a8430ddc8bn%40googlegroups.com.

Reply via email to