!lymvtcwDJ7ZA9Npq:lix.systems

Lix Development

404 Members
(Technical) development of Lix, the package manager, a Nix implementation. Please be mindful of ongoing technical conversations in this channel.135 Servers

Load older messages


SenderMessageTime
10 Nov 2025
@qyriad:katesiria.orgQyriad ban == for sets entirely and require defining a __eq? /hj 09:11:58
@piegames:flausch.socialpiegames So my take is that for most data structures ("types"), the code doesn't change between most instances. So it could be factored out of the comparison. Only attrs that actually need per-value functions to be different would be incomparable 09:16:14
@piegames:flausch.socialpiegamesYknow, just the normal stuff from most every other language09:16:25
@k900:0upti.meK900I mean having a user defined __eq would be good for other reasons as well09:17:59
@k900:0upti.meK900But it's also a super hard compat break09:18:06
@qyriad:katesiria.orgQyriad I think something that is clear at the least is that Nixpkgs lib should have a lib.attrsets.equalsWithoutFunctions or something 09:23:42
@xokdvium:matrix.orgSergei Zimmerman (xokdvium)It is there btw09:23:58
@k900:0upti.meK900 There's lib.platforms.equals or something 09:24:20
@k900:0upti.meK900But it will never be used consistently if the obvious thing is allowed09:24:30
@xokdvium:matrix.orgSergei Zimmerman (xokdvium) Also lib.systems.equals is horribly slow and inefficient 09:25:04
@k900:0upti.meK900Imagine having sane platform definitions09:25:21
@k900:0upti.meK900tbh09:25:22
@xokdvium:matrix.orgSergei Zimmerman (xokdvium)I wanted to highlight that, yeah. There's no supporting the borked equality semantics with a more "optimized" object model. You either a) ditch support for old nix expressions b) suffer the lack of manoeuvrability in terms of the implementation. 09:27:50
@shine:proqqul.netTaeer Bar-Yam
In reply to @piegames:flausch.social
The would probably not mesh well with future performance optimisations
What future performance optimisations are you thinking of? Maybe we can solve those problems too!
13:53:59
@shine:proqqul.netTaeer Bar-Yam

So one issue I'm seeing is that "best effort" or "marginal effort" function equality checking will tend to be unstable because the set of functions we can determine equal, and the set of functions that we can distinguish between will both fluctuate based on our implementation.

How's this for a plan?

(a) fix nixpkgs so it doesn't use function equality checking
(b) output a warning when people try to use function equality checking. something to the effect of "this is unstable and exists for backwards compatibility"
(c) maintain an unstable version of function equality checking, that is only guaranteed to work in situations where function equality currently works.

We can introduce a flag --no-function-equality like we have --no-url-literals

That way people can continue to evaluate old versions of nixpkgs, but people are unlikely to depend on how the features is implemented now (certainly in nixpkgs), so we are free to adjust it to new implementations, even though it breaks edge cases, since nobody will be using those edge cases.

15:14:21
@piegames:flausch.socialpiegamesBytecode interpreter with compiler optimizations, inlining, common subexpression elimination etc16:13:23
@aloisw:julia0815.dealoisw What is tristate about that? It has five values out of which three are "not supported". 17:04:22
@k900:0upti.meK900That's the joke yes17:11:26
@raitobezarius:matrix.orgraitobezariusIt's unclear that in our case we can re-emulate fully the funext behavior18:54:26
@raitobezarius:matrix.orgraitobezariusThis week, I'm swamped with a lot of $WORK, so I'm not sure I will have time to react to anything18:54:47
11 Nov 2025
@raitobezarius:matrix.orgraitobezariusSome after the work thoughts on pointer equality, my conclusion is similar to Taeer's ones. I look at it this way: for pointer equality use be sound, you need to have a **reflexive** binary relation to apply it to. Structural comparisons are mostly like this except when it comes to incomparable pieces of opaque value like functions. But that's a historical accident and one that I fail to convince myself you can rely on in good faith to write production Nix code. As a result, I would be in favor of making that comparison true even if it was not before. I am quite against reverting the whole thing because now accidental infinite recursions have decreased in occurrence by the virtue of sharing more (graphs with cycles of the exact same object identity wise collapsed into DAGs). Obviously, we need to go and empirically prove that this change won't worsen things. The idea of offering a modified equality operator is interesting in the context because we could abuse scopedImport to create a compatibility mode and we could (no one is gonna let me do that but who knows) expose builtins to construct your own flavor of pointer equality to pass to the scoped import to make broken code run again.01:33:24
@raitobezarius:matrix.orgraitobezarius(extra spiciness: > desugars... and involves pointer equality albeit irreflexive?)01:39:12
@winter:catgirl.cloudWinterlogged in to forgejo, got a 500 (from fj). kept refreshing, getting 500s, then eventually got back to the dashboard (logged out). clicked log in again, then everything worked.06:04:51
@winter:catgirl.cloudWinterjfyi06:04:57
@delroth:delroth.netdelrothscrapers are hammering git.lix.systems and causing too many postgres connections11:15:34
@delroth:delroth.netdelrothI just looked into it again and figured out that our extremely basic anti-scraping was in fact not doing anything due to a corrupted nftables internal state11:15:57
@delroth:delroth.netdelrothso uh hopefully we have fewer problems from now on and nobody got accidentally false-positived11:16:25
@delroth:delroth.netdelrothif you are having issues accessing git.lix.systems over v4 (timeouts) lmk11:16:51
@shine:proqqul.netTaeer Bar-Yam

that's a historical accident and one that I fail to convince myself you can rely on in good faith to write production Nix code

Clarification: "that" here is referring to functions comparing non-equal when they are, in fact, equal?

I would be in favor of making that comparison true even if it was not before.

I think this is fine as long as it's a one-way ratchet. My concern is that we will make something compare equal (that is equal), people start depending on that behaviour, and then later change the structure again in a way that makes those compare non-equal. This is why I was proposing we mark this feature as unstable (maybe unstable isn't the right word, because there's no intention to make it stable in the future)

I think we're somewhat lucky in that the state of affairs we need to be backward-compatible with at the moment (pointer equality in CppNix), is very weak (in the sense that very few things compare equal), so it's easy to maintain backward compatibility with it. If we add more things to the relation, it will become harder to change things in ways that maintain backward compatibility. (where by backward compatibility i mean things that used to compare equal continue to compare equal, but not necessarily the inverse)

I am quite against reverting the whole thing

Clarification: by "the whole thing" you're referring to pointer equality?

expose builtins to construct your own flavor of pointer equality to pass to the scoped import to make broken code run again.

Wouldn't what we can expose be super dependent on implementation details?

14:47:10
@raitobezarius:matrix.orgraitobezarius

Clarification: "that" here is referring to functions comparing non-equal when they are, in fact, equal?

"that" refers to any (pointer) equality that evaluated to false when it should have evaluated to true

15:02:55

Show newer messages


Back to Room ListRoom Version: 10