Statements dreamed up by the utterly deranged
> (eq 'a 'b) is false.
> (eq 'a 'a) is true.
> (eq 3 3) might be true or false, depending on the implementation.
In what universe 3 and 3 might not be equal by any metric imaginable? Common Lisp is truly a cursed language.
@lunarised what if I just wanna compare to values? Surely, I could just use `equal` everywhere, except it doesn't always work on symbols.
>Symbols are compared as for eq. This method of comparing symbols can violate the rule of thumb for equal and printed representations, but only in the infrequently occurring case of two distinct symbols with the same print name.
What the literal fuck is this shit?
@lunarised going further, from the same page:
>Two arrays are equal only if they are eq, with one exception: strings and bit-vectors are compared element-by-element.
@lunarised yeah. And it's probably an incredible amount of really really stupid reasons, none of which I could give a single damn about.
Look, if I can't just compare two values for equality in your language without having to bother about what those values are, then it's probably not a good language.
@lunarised just one is enough. If you want to compare references, then do exactly that and compare references.
(eq (ref a) (ref b))
for example. There's literally no need for more than one equality operator ever.
@pureevil @lunarised This, admittedly, was a serious misstep. In practice it doesn't matter much, because you rarely need to compare arrays other than strings (and many uses of strings are replaced by symbols). But it's weird that the only standard generic function for this is equalp, which also forces case-insensitive character comparisons.
I rarely use anything other than = for numbers, eql for keys in a data structure, and equal for pretty much everything else.
f :: Eq a => a -> a -> IO ()
f x y | x == y = putStrLn "Equal"
| otherwise = putStrLn "Not equal"
How do I do the same in Common Lisp? Exactly..
@pureevil @lunarised Depending on your goal, you could make it a generic function that defaults to equal (or an appropriate alternative for non-string arrays), accepting that other users can override it however they want. Alternatively, you could use generic-cl which replaces many standard library functions, including equal, with generic versions. Then the function would call the generic version of equal, however the actual types choose to implement it.
@pureevil @lunarised Two unequal symbols with the same name in the same package is not something you would encounter in sane code. The only way it could happen is with two gensyms where you specifically manipulated the gensym counter in between; in that case, it's very intentional that they compare unequal.
I would strongly recommend learning the language from something like Practical Common Lisp, the CMU page is rather obtuse: https://gigamonkeys.com/book/
@curtmack @lunarised I think I'll just pass on Lisp again, thank you. Equality operators is just one of the problems. There's just too many things missing in CL (and often in other lisps) that I take for granted in other languages.
For example, I've just discovered that Quicklisp doesn't support pulling dependencies from git. Where in cargo or stack or literally any other language-specific package manager I can just specify git url and commit hash, in Lisp I need to perform some sort of magic.
All of this is just too much.
The social network of the future: No ads, no corporate surveillance, ethical design, and decentralization! Own your data with Mastodon!