this post was submitted on 18 May 2024
357 points (97.6% liked)
Programmer Humor
19503 readers
1246 users here now
Welcome to Programmer Humor!
This is a place where you can post jokes, memes, humor, etc. related to programming!
For sharing awful code theres also Programming Horror.
Rules
- Keep content in english
- No advertisements
- Posts must be related to programming or programmer topics
founded 1 year ago
MODERATORS
you are viewing a single comment's thread
view the rest of the comments
view the rest of the comments
I think its type system is "okay", I mean inherently dynamic typing is pretty error-prone. But its type coercion algorithms are bonkers. Also that whole "NaN ≠ NaN" business...
See that's one of the parts that is actually almost in line with other languages. In Go, for example,
nil ≠ nil
becausenil
is, by definition, undefined. You can't say whether one thing that you know nothing about is at all like something else that you know nothing about. It really should raise an exception at the attempt to compare NaN though.If nil ≠ nil, how do you compare a variable to the literal?
You'd first check for nil values, then compare like normal. Extra step, yes, but it keeps you from hitting NPEs through that route.
What does this mean, if not the same as
?
IIRC, a nil value can be checked against a literal successfully but not against another nil value. Say you want to check for equality of two vars that could be nil. You just need an extra if statement to ensure that you are not trying to compare nil and nil or nil and a non-nil value (that'll give you a type error or NPE):
What I mean is that in JS you can't do
NaN != NaN
, not evenvariable != NaN
. So you're not saying it's the same in Go, since you can doa != nil
?Kinda.
nil
is a weird value in Go, not quite the same asnull
orNone
in JS and Python, respectively. Anil
value may or may not be typed and it may or may not be comparable to similar or different types. There is logical consistency to where these scenarios can be hit but it is pretty convoluted and much safer, with fewer footguns to check fornil
values before comparison.I'm other words, in Go
(nil == nil) || (nil != nil)
, depending on the underlaying types. One can always check if a variable has anil
value but may not be able to compare variables if one or more have anil
value. Therefore, it is best to first check fornil
values to protect against errors that failure to execute comparisons might cause (anything from incorrect outcome to panic).ETA: Here's some examples
Thoroughly confusing lol. I think I need to check the spec in order to grasp this. I feel like this has more to do with the typing system rather than
nil
itself, maybe. I'll see.But yeah, this is nothing like
null
orundefined
in JS, but more similar toNaN
.Thank you for trying to explain!
Yeah... It's weird but I find it useful that it is, in a weird way. Treating it as an uncertainty means that one MUST explicitly check all pointers for
nil
as part of normal practice. This avoids NPEs.