• Subject: Re: [FUN] A bit of code golfing
• From: Egor Skriptunoff <egor.skriptunoff@...>
• Date: Fri, 30 Sep 2016 21:42:35 +0300

On Thu, Sep 29, 2016 at 10:16 PM, Soni L. wrote:

On 29/09/16 03:26 PM, Egor Skriptunoff wrote:

IMO, "string.sub(index_from, index_to)" will be more handy if "index_from = 0'
would mean "the index after the last character"
instead of "the index before the first character".
("index_to = 0" should mean "index before the first character", as it is currently implemented in Lua)

The unexpected result of "str:sub(0)" makes programming a bit harder,
as this "feature" is actually a trap, and you are compelled
to use additional "if" to make things right.
But surprisingly, this weird logic can be beneficial in codegolf :-)

Don't you mean to say Lua should add a special-case for -0 and go against the rule of treating 0 and -0 as equal?

Negative zero is a very fragile object :-)
It can be killed accidentally by any harmless arithmetic operation.
IMO, no API should rely on negativity of zero.

I'd suggest to redefine the interpretation of zero value for "index_from" argument of string:sub.
The documentation may look like the following:

Positive indexes 1, 2, 3... count from the beginning of the string.
Negative indexes -1, -2, -3,... count backward from the end of the string.
Index 0 has special meaning, its semantic is different for "index_from" and "index_to" arguments:
index_from = 0 means "the index after the last character of the string"
index_to = 0 means "the index before the first character of the string"
In other words, the "rule of maximum restriction" holds.
There are two related Lua idioms: for any non-negative N prefix of length N is ":sub(1, N)" and suffix of length N is ":sub(-N)".