guile-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: The Guile junk drawer and a C plea


From: Maxime Devos
Subject: RE: The Guile junk drawer and a C plea
Date: Sun, 30 Jun 2024 11:45:01 +0200

>Maxime Devos <maximedevos@telenet.be> writes:

>> ```

>> #!r6rs

>> (library (foo)

>>    (export foo)

>>    (import (rnrs base))

>>    (define foo

>>      (cons 'a 1)))

>> ```

> Here you are demonstrating how R6RS libraries have the _same_ problem. You should at least have included a version number next to (rnrs

> base). Who knows, maybe R8RS will rename ‘cons’ to ‘make-pair’?

 

>Keep in mind that adding a version number does not resolve

backwards compatibility. It just moves it so source maintenance instead

of package maintenance — and then adds more complexity in keeping the

system compatible with different versions of itself.

 

>You’ll then have to test every version of Scheme with every other

version, else you get breakage the moment a library updates to a newer

version of Scheme while another is still on the old version.

 

No it doesn’t, because of _the version number_.  If you put (6) next to the module name, that’s the _exact_ version number, it’s not ‘6 or later’ or ‘maybe 6 whatever’, it’s ‘exactly 6’. You could load multiple versions of a module at the same time! (Not actually implemented currently, but it _could_ relatively easily be implemented.)

 

Also, what source maintenance? Software, that isn’t subject to changing external demands, doesn’t rot, and a _precise_ version number is included which implies the lack of changing external demand.

 

In terms of implementation, realistically there would be a single module version that contains the actual implementation, and various other version variants that only say ‘take these binding from that module (vN), with those renamings’ (and the occasional ‘this binding was removed / has different arguments / ..., let’s provide a small wrapper).

 

>You can use methods to shift the load of backwards compatibility to

different groups, but you cannot remove it.

 

I’m pretty sure you can remove backwards compatibility, just replace ‘cons’ by ‘make-pair’ in Guile code and see what happens.

 

I think it’s better though to preserve backwards compatibility, e.g. by implementing version number support for modules with a _well-defined_ API.

 

Note the emphasis on _well-defined_ -- if some API (in terms of semantics and not just bikeshedding over naming and argument order) is just what we have currently instead of something that is expected to remain the same (except perhaps for pure additions), and hence could easily change in the future, then version numbers are just going to lead to new problems.

 

But in the case of _(guile)_, for most things in (guile) this isn’t really the case. Likewise, (rnrs ...) is pretty well-defined – there are some changes to RnRS stuff, but it’s mostly just additions, removals and reorderings – the semantics appear to have remained pretty much the same.

 

Best regards,

Maxime Devos


reply via email to

[Prev in Thread] Current Thread [Next in Thread]