nine_k 16 hours ago

This indeed is not Algol (or rather C) heritage, but Fortran heritage, not memory offsets but indices in mathematical formulae. This is why R and Julia also have 1-based indexing.

  • cmrdporcupine 14 hours ago

    Pascal. Modula-2. BASIC. Hell, Logo.

    Lately, yes, Julia and R.

    Lots of systems I grew up with were 1-indexed and there's nothing wrong with it. In the context of history, C is the anomaly.

    I learned the Wirth languages first (and then later did a lot of programming in MOO, a prototype OO 1-indexed scripting language). Because of that early experience I still slip up and make off by 1 errors occasionally w/ 0 indexed languages.

    (Actually both Modula-2 and Ada aren't strictly 1 indexed since you can redefine the indexing range.)

    It's funny how orthodoxies grow.

    • teo_zero 14 hours ago

      In fact zero-based has shown some undeniable advantages over one-based. I couldn't explain it better than Dijkstra's famous essay: http://www.cs.utexas.edu/~EWD/ewd08xx/EWD831.PDF

      • cmrdporcupine 13 hours ago

        It's fine, I can see the advantages. I just think it's a weird level of blindness to act like 1 indexing is some sort of aberration. It's really not. It's actually quite friendly for new or casual programmers, for one.

    • fc417fc802 6 hours ago

      As I understand it Julia changed course and is attempting to support arbitrary index ranges, a feature which Fortran enjoys. (I'm not clear on the details as I don't use either of them.)

    • nine_k 14 hours ago

      Pascal, frankly, allowed to index arrays by any enumerable type; you could use Natural (1-based), or could use 0..whatever. Same with Modula-2; writing it, I freely used 0-based indexing when I wanted to interact with hardware where it made sense, and 1-based indexes when I wanted to implement some math formula.

    • bsder 6 hours ago

      > Lots of systems I grew up with were 1-indexed and there's nothing wrong with it. In the context of history, C is the anomaly.

      The problem is that Lua is effectively an embedded language for C.

      If Lua never interacted with C, 1-based indexing would merely be a weird quirk. Because you are constantly shifting across the C/Lua barrier, 1-based indices becomes a disaster.

  • IshKebab 15 hours ago

    And MATLAB. Doesn't make it any better that other languages have the same mistake.

idle_zealot 17 hours ago

Does it count as 0-indexing when your 0 is a floating point number?

  • krackers 16 hours ago

    Actually in JS array indexing is same as property indexing right? So it's actually looking up the string '0', as in arr['0']

    • idle_zealot 15 hours ago

      Huh. I always thought that JS objects supported string and number keys separately, like lua. Nope!

        [Documents]$ cat test.js
        let testArray = [];
        testArray[0] = "foo";
        testArray["0"] = "bar";
        console.log(testArray[0]);
        console.log(testArray["0"]);
        [Documents]$ jsc test.js
        bar bar
        [Documents]$
      • nvlled 10 hours ago

        Lua supports even functions and objects as keys:

          function f1() end
          function f2() end
          local m1 = {}
          local m2 = {}
          local obj = {
              [f1] = 1,
              [f2] = 2,
              [m1] = 3,
              [m2] = 4,
          }
          print(obj[f1], obj[f2], obj[m1], obj[m2], obj[{}])
        
        Functions as keys is handy when implementing a quick pub/sub.
      • aidenn0 15 hours ago

        They do, but strings that are numbers will be reinterpreted as numbers.

        [edit]

          let testArray = [];
          testArray[0] = "foo";
          testArray["0"] = "bar";
          testArray["00"] = "baz";
          console.log(testArray[0]);
          console.log(testArray["0"]);
          console.log(testArray["00"]);
        • minitech 14 hours ago

          That example only shows the opposite of what it sounds like you’re saying, although you could be getting at a few different true things. Anyway:

          - Every property access in JavaScript is semantically coerced to a string (or a symbol, as of ES6). All property keys are semantically either strings or symbols.

          - Property names that are the ToString() of a 31-bit unsigned integer are considered indexes for the purposes of the following two behaviours:

          - For arrays, indexes are the elements of the array. They’re the properties that can affect its `length` and are acted on by array methods.

          - Indexes are ordered in numeric order before other properties. Other properties are in creation order. (In some even nicher cases, property order is implementation-defined.)

            { let a = {}; a['1'] = 5; a['0'] = 6; Object.keys(a) }
            // ['0', '1']
          
            { let a = {}; a['1'] = 5; a['00'] = 6; Object.keys(a) }
            // ['1', '00']
bigstrat2003 12 hours ago

There's nothing wrong with 1-based indexing. The only reason it seems wrong to you is because you're familiar with 0-based, not because it's inherently worse.

  • IshKebab 12 minutes ago

    That's simply untrue. 1-based indexing is inherently worse because it leads to code that is less elegant and harder to understand. And slightly less efficient but that's a minor factor.

coliveira 16 hours ago

If you can't deal with off-by-one errors, you're not a programmer.

  • jancsika 8 hours ago

    But with Lua all those errors are now off by two