Problem: [package require] is limited in what requirements you can express.
I need Tcl of at least version 7.5
Best current expression:
if {[catch {package require Tcl 8}]} { package require Tcl 7.5 }
...and that will need more branches to support Tcl 9.
I need foo 1.2 or better, except for foo 1.3.4, which I know has a bug I can't work around, but I know it got fixed in 1.3.5, and it's still working with the current release 2.3.1
Probably the best solution currently is to temporarily remove any [package ifneeded foo 1.3.4] registration before calling [package require]. If the bug covers many releases, though, that can be tedious.
So, how about an extension of the [package require] syntax to:
package require $package ?$range ...?
A range would have the form: $minVersion?-$maxVersion?
The interpretation is that version $minVersion is acceptable, and all versions greater than $minVersion and less than $maxVersion are acceptable.
As a special case, if $minVersion and $maxVersion are the same, then only exactly that version is acceptable. That is,
package require bar 1.3.2-1.3.2
is equivalent to
package require -exact bar 1.3.2
(but gets rid of the nasty switch!)
For compatibility, if only a single $minVersion is supplied, then the default $maxVersion value is the next higher major version. For example,
package require foo 1.2
is equivalent to
package require foo 1.2-2
If the - appears, but no $maxVersion, then there is no upper limit.
For the examples above:
package require Tcl 7.5-9
and when Tcl 9 is released, and we see that our program still works:
package require Tcl 7.5-10
Or, if we want to make the users our testers for compatibility with future Tcl:
package require Tcl 7.5-
The second example:
package require foo 1.2-1.3.4 1.3.5-3