On Thursday, 8 February 2024 at 16:54:36 UTC, Kevin Bailey wrote:
Additionally, it doesn't address the issue. It still requires
me to both realize the issue with comparing an int to length's
mystery type, as well as to fix it for the compiler.
(And it's beside the fact that the start value could just as
easily be an int (parameter for example) that could take a
negative value. This was the case for one of my cases.)
It appears that some strongly typed languages like Rust
necessitate explicit casting similar to D in this particular
case. And some extremely strongly typed languages like Ada
requires it to another level.
```rust
fn main() {
let something = vec!['a', 'b', 'c'];
println!("len: {}", something.len()); // 3
for i in -1..=something.len() as i32 {
println!("i: {}", i);
}
}
```
Like D, Rust's 'len()' function returns an unsigned integer
`usize`. It has to be cast to `int` to deal with the `-1` index
or it will not compile.
```
for i in -1..=something.len() {
| ^^ the trait `Neg` is not implemented for `usize`
```
But there are some modern languages in which the length function
returns a signed integer by default .. such as Odin. [`len ::
proc(v: Array_Type) -> int
{…}`](https://pkg.odin-lang.org/base/builtin/#len). So there is
no requirement for casting in Odin in this particular case. An
experienced Odin programmer replied to me on the Odin Discord
stated: "It is int in the default context, but if the type system
sees it is being used in the context of something that wants a
uint it will return that."
```c
package main
import "core:fmt"
main :: proc() {
something := []byte{'a', 'b', 'c'}
fmt.println("length of 'len(something): ", len(something))
fmt.printf("type of 'len(something)': %T\n", len(something))
// int
for i := -1; i < len(something); i += 1 {
fmt.println("i: ", i)
}
}
```
Thank you everyone for this interesting discussion on languages
and language design.