Worse is better is about much much more than exposing versus not exposing implementation details.
Exposing implementation details is also not quite the same thing as a leaky abstraction (although they can coincide). eqv? can be both, if you regard "cons" as an abstraction of a mathematical pair. OTOH, if you regard cons as allocating a mutable pair object, then it is neither.
Providing a function to trigger garbage collection is exposing an implementation detail, but not leaking abstraction.
It's harder to come up with examples of leaky abstractions that don't in some sense expose implementation details. I'm not sure they exist.
Exposing implementation details is also not quite the same thing as a leaky abstraction (although they can coincide). eqv? can be both, if you regard "cons" as an abstraction of a mathematical pair. OTOH, if you regard cons as allocating a mutable pair object, then it is neither.
Providing a function to trigger garbage collection is exposing an implementation detail, but not leaking abstraction.
It's harder to come up with examples of leaky abstractions that don't in some sense expose implementation details. I'm not sure they exist.