X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Flate-extensions.lisp;h=bcfaafed4f0661e0f36b17689e63637e607c692c;hb=920b5eb02b1e1fd1c6c28395cade04e81fbee2bb;hp=48ee19018a5a4bb5293aed29a97caf77fa574ac0;hpb=6574cbfa9d13afc3b4d55cc2fa5777b34c69444a;p=sbcl.git diff --git a/src/code/late-extensions.lisp b/src/code/late-extensions.lisp index 48ee190..bcfaafe 100644 --- a/src/code/late-extensions.lisp +++ b/src/code/late-extensions.lisp @@ -436,3 +436,51 @@ Works on all CASable places." for ,new = (cdr ,old) until (eq ,old (setf ,old ,cas-form)) finally (return (car ,old)))))) + +(defun split-version-string (string) + (loop + with start = 0 + and end = (length string) + while (and start (< start end)) + for subversion = (multiple-value-bind (subversion next) + (parse-integer string :start start + :junk-allowed t) + (setf start + (and subversion + next + (< next end) + (eql #\. (aref string next)) + (1+ next))) + subversion) + when subversion + collect subversion)) + +(defun version>= (x y) + (unless (or x y) + (return-from version>= t)) + (let ((head-x (or (first x) 0)) + (head-y (or (first y) 0))) + (or (> head-x head-y) + (and (= head-x head-y) + (version>= (rest x) (rest y)))))) + +(defun assert-version->= (&rest subversions) + #!+sb-doc + "Asserts that the current SBCL is of version equal to or greater than +the version specified in the arguments. A continuable error is signaled +otherwise. + +The arguments specify a sequence of subversion numbers in big endian order. +They are compared lexicographically with the runtime version, and versions +are treated as though trailed by an unbounded number of 0s. + +For example, (assert-version->= 1 1 4) asserts that the current SBCL is +version 1.1.4[.0.0...] or greater, and (assert-version->= 1) that it is +version 1[.0.0...] or greater." + (let ((version (split-version-string (lisp-implementation-version)))) + (unless (version>= version subversions) + (cerror "Disregard this version requirement." + "SBCL ~A is too old for this program (version ~{~A~^.~} ~ + or later is required)." + (lisp-implementation-version) + subversions))))