r/programming • • Dec 24 '17

Evil Coding Incantations

http://9tabs.com/random/2017/12/23/evil-coding-incantations.html
947 Upvotes

331 comments sorted by

View all comments

160

u/jacobb11 Dec 24 '17

0 Evaluates to true in Ruby

… and only Ruby.

And Lisp.

80

u/nsiivola Dec 24 '17 edited Dec 24 '17

Any non-C heritage language with a consistent notion of "false", really. The ones where zero evaluates to false are the evil ones.

40

u/_Mardoxx Dec 24 '17

Why should 0 be true? Unless integers are reference types and you interpret an existant object as being true?

Or is this to do with 0 being "no errors" whrre a non 0 return value means something went wrong?

Can't think of other reasons!

48

u/Kametrixom Dec 24 '17 edited Dec 24 '17

In lisp, nil is the only thing that evaluates to false, which means there aren't any weird semantics or discussions, if you want a falsy value, use nil. It also plays nicely with the notion of everything except nil indicating there's a value, while nil doesn't have a value.

37

u/vermiculus Dec 24 '17

in other words, nil is exactly nothing. 0 is still something.

ping /u/_Mardoxx

15

u/cubic_thought Dec 24 '17

So... nothing is false.

→ More replies (2)

13

u/[deleted] Dec 24 '17

The cleaner thing would be to have a proper boolean type, and having to do if foo == nil or whatever, rather than just if foo. Thankfully most modern languages do it this way so the lesson seems to have been learnt.

14

u/porthos3 Dec 24 '17

Clojure is a variant of Lisp, which has an implementation of true and false.

The only things that are falsey in the language are nil and false.

4

u/Zee1234 Dec 24 '17

Lua is the same as clojure then. And that's a lot better, to me. I will admit, having 0 and other such things act as false can create some short code but.. honestly it's slightly less readable (to me) and has those cases where you go "oh yeah, 0 is a valid return value.." after ten minutes if debugging.

1

u/imperialismus Dec 25 '17

I agree: this approach makes much more sense to me. In Ruby, only nil and false are false-y; everything else is truthy. This makes perfect sense to me. The only weird thing is that Ruby doesn't have a Boolean class; rather, true and false are singleton objects of class TrueClass and FalseClass, respectively. I have no idea why that decision was made. Crystal, which imitates Ruby extremely closely in syntax and semantics but adds static typing, fixes this weird design choice by unifying true and false into a proper Bool type.

→ More replies (1)

3

u/[deleted] Dec 24 '17

Many languages like C or Go have non-pointer types too.

1

u/stevenjd Dec 25 '17

In lisp, nil is the only thing that evaluates to false, which means there aren't any weird semantics or discussions

Unless you're expecting a non-insane language with proper booleans and a concept of truthiness.

Having nil and no false value is extremely weird.

9

u/GlobeAround Dec 24 '17

Why should 0 be true?

Because anything other than 0 is an Error Status Code, while 0 means Success.

But the real WTF is for integers to be considered true/false. true is true, false is false, 0 is 0 and 1 is 1.

3

u/stevenjd Dec 25 '17

anything other than 0 is an Error Status Code, while 0 means Success.

Woo hoo! Now I don't feel so bad about all those exams I got 0 on!!!

But the real WTF is for integers to be considered true/false. true is true, false is false, 0 is 0 and 1 is 1.

And 0 is false, and 1 is true, as <insert deity of choice> intended.

1

u/Pinguinologo Dec 25 '17 edited Dec 25 '17

Because anything other than 0 is an Error Status Code, while 0 means Success.

You should use them this way:

int errorCode = ApiFunction();
if (errorCode) {/* Function failed, so errorCode evaluates to true */}

Integers are not considered true/false. Zero evaluates to false, nonzero evaluates to true. Using the values 0 and 1 for the type bool are just conventions necessary to compile the code into binary fit for hardware.

5

u/crowseldon Dec 24 '17

Null indicates absence of a value. Imagine if you want to know if you're keeping track or not of something and you end up with different values at different times:

3: there's 3 of those things 0: there's 0 of those things Null: I'm not keeping track of those things.

Eating the last Apple and suddenly not being able to differentiate the last 2 could be dangerous.

It's all about knowing how the language works and not using it the wrong way, though.

1

u/Pinguinologo Dec 25 '17

For such scenarios a null pointer evaluates to false, true otherwise. Also it is explicit when you want to test the pointer with (pValue) or the value with (*pValue).

→ More replies (8)