join $listOfNonNegativeIntegers .Want to add recognition of things like 8.4b1Concept: allow values -1 and -2 in the list.Wherever the result has .-1. replace with bWherever the result has .-2. replace with aImplies: a or b can't be next to a .a or b can't be first or last char in version numberThings like 1.2a5b3.7 are OK (if weird)Specification:[package vcompare] extended obvious way (-2 < -1 < 0).[package vsatisfies] -- need to specify sensible rules (for itself and to be used by [package require])[package vsatisfies 1.1 1.0] => 1[package vsatisfies 1.1a0 1.0] => 1[package vsatisfies 1.1b0 1.0] => 1Note: implies responsibility for controlling package availability placed on package installer! (Provide alpha/beta releases to developers, but hide from end-users, for example -- special TCLLIBPATH, etc.)[package vsatisfies 1.1a1 1.1a0] => ???[package vsatisfies 1.1b0 1.1a0] => ???[package vsatisfies 1.1 1.1a0] => ???[package vsatisfies 1.1b1 1.1b0] => ???[package vsatisfies 1.1 1.1b0] => ???Also consider new cases when package BoF: PACKAGE REQUIRE support for RANGES of acceptable versions is present.[package vsatisfies $version $range ?$range ...?]
Why stop to a and b?
proc vsplit {ver} { if {![regexp {^\d+($|(.\d+|[a-z]{1}(\d+|$))*)$} $ver]} {error "expected version number but got \"$ver\""} set r {} foreach {a b c d e} [regexp -all -inline {(\d+)[.$]?|([a-z])($|(\d+))} $ver] { if {$b ne {}} {lappend r $b} else { lappend r [expr {[scan $c %c]-123}] if {$d ne {}} {lappend r $d} } } return $r } proc vcompare {uv vv} { set uv [vsplit $uv] set vv [vsplit $vv] if {[set m [llength $uv]] > [llength $vv]} { lappend vv {*}[lrepeat [expr {$m-[llength $vv]}] 0] } elseif {[set m [llength $vv]] > [llength $uv]} { lappend uv {*}[lrepeat [expr {$m-[llength $uv]}] 0] } for {set i 0} {$i < $m} {incr i} { if {[lindex $uv $i] < [lindex $vv $i]} {return -1} if {[lindex $uv $i] > [lindex $vv $i]} {return 1} } return 0 }I wrote this because I needed something like this. So far it has worked, but I haven't tested it a lot. Or at all.It does:
- allow letters in version numbers (1.2a, 1.2a5, 1.2a5b3.7, 0.59r)
- conform to [package vcompare] even to extent of error message
- not allow a letter to be followed by a letter, or version number to start with anything but a number
- require 8.5 due {*} and [lrepeat]
- bite the bullet in performance and elegance, probably.