6 ms·
Big "college freshman" energy in this take: I personally prefer to make the error state part of the objects: Streams can be in an error state, floats can be
by mwkaufma 11mo ago
Big "college freshman" energy in this take:
I personally prefer to make the error state part of the objects: Streams can be in an error state, floats can be NaN and integers should be low(int) if they are invalid (low(int) is a pointless value anyway as it has no positive equivalent).
It's fine to pick sentinel values for errors in context, but describing 0x80000000 as "pointless" in general with such a weak justification doesn't inspire confidence.
- ratmice 11mo agoWithout the low int the even/odd theorem falls apart for wrap around I've definitely seen algorithms that rely upon that. I would agree, whether error values are in or out of band is pretty context dependent such as whether you answered a homework question wrong, or your dog ate it. One is not a condition that can be graded.
- School-Cotton 11mo agoWhat is the "even/odd theorem" ?
- ratmice 11mo agothat all integers are either even or odd, and that for an even integer that integer + 1 and - 1 are odd and vice versa for odd numbers. That the negative numbers have an additional digit from the positive numbers ensures that low(integer) and high(integer) have different parity. So when you wrap around with overflow or underflow you continue to transition from an even to odd, or odd to even.
- xigoi 11mo agoIf you need wraparound, you should not use signed integers anyway, as that leads to undefined behavior.
- ratmice 11mo agoPresumably since this language isn't C they can define it however they want to, for instance in rust std::i32::MIN.wrapping_sub(1) is a perfectly valid number.
- School-Cotton 11mo agoSigned overflow being UB (while unsigned is defined to wrap) is a quirk of C and C++ specifically, not some fundamental property of computing.
- xigoi 11mo agoNim (the original one, not Nimony) compiles to C, so making basic types work differently from C would involve major performance costs.
- School-Cotton 11mo ago> making basic types work differently from C would involve major performance costs. Not if you compile with optimizations on. This C code: int wrapping_add_ints(int x, int y) { return (int)((unsigned)x + (unsigned)y); } Compiles to this x86-64 assembly (with clang -O2): wrapping_add_ints: lea eax, [rdi + rsi] ret Which, for those who aren't familiar with x86 assembly, is just the normal instruction for adding two numbers with wrapping semantics.
- 11mo ago
- Mond_ 11mo agoMeh, you also see algorithms that have subtle bugs because the author assumed that for every integer x, -x has the same absolute value and opposite sign. I view both of these as not great. If you strictly want to rely on wraparound behavior, ideally you specify exactly how you're planning to wrap around in the code.
- sevensor 11mo agoI have been burned by sentinel values every time. Give me sum types instead. And while I’m piling on, this example makes no sense to me: proc fib[T: Fibable](a: T): T = if a <= 2: result = 1 else: result = fib(a-1) + fib(a-2) Integer is the only possible type for T in this implementation, so what was the point of defining Fibable?
- Hendrikto 11mo agoI agree about sentinel values. Just return an error value. I think the fib example is actually cool though. Integers are not the only possible domain. Everything that supports <=, +, and - is. Could be int, float, a vector/matrix, or even some weird custom type (providing that Nim has operator overloading, which it seems to). May not make much sense to use anything other than int in this case, but it is just a toy example. I like the idea in general.
- sevensor 11mo agoWell, I agree about Fibable, it’s fine. It’s the actual fib function that doesn’t work for me. T can only be integer, because the base case returns 1 and the function returns T. Therefore it doesn’t work for all Fibables, just for integers.
- cb321 11mo agoIn this case, it compiles & runs fine with floats (if you just delete the type constraint "Fibable") because the string "1" can be implicitly converted into float(1) { or 1.0 or 1f64 or float64(1) or 1'f64 or ..? }. You can think of the "1" and "2" as having an implicit "T(1)", "T(2)" -- which would also resolve your "doesn't work for me" if you prefer the explicitness. You don't have to trust me, either. You can try it with `echo fib(7.0)`. Nim is Choice in many dimensions that other PLang's are insistently monosyllabic/stylistic about - gc or not or what kind, many kinds of spelling, new operator vs. overloaded old one, etc., etc., etc. Some people actually dislike choice because it allows others to choose differently and the ensuing entropy creates cognitive dissonance. Code formatters are maybe a good example of this? They may not phrase opposition as being "against choice" as explicitly as I am framing it, but I think the "My choices only, please!" sentiment is in there if they are self-aware.
- k__ 11mo agoI had the impression, the creator of Nim isn't very fond of academic( solution)s.