Ticket #293: loop.diff

File loop.diff, 1.3 KB (added by stassats, 11 years ago)
  • loop.lisp

     
    976976
    977977(defun loop-typed-init (data-type &optional step-var-p)
    978978  (when (and data-type (subtypep data-type 'number))
    979     (if (or (subtypep data-type 'float)
    980       (subtypep data-type '(complex float)))
    981   (coerce (if step-var-p 1 0) data-type)
    982   (if step-var-p 1 0))))
     979    ;; From SBCL
     980    (let ((init (if step-var-p 1 0)))
     981      (flet ((like (&rest types)
     982               (coerce init (find-if (lambda (type)
     983                                       (subtypep data-type type))
     984                                     types))))
     985        (cond ((subtypep data-type 'float)
     986               (like 'single-float 'double-float
     987                     'short-float 'long-float 'float))
     988              ((subtypep data-type '(complex float))
     989               (like '(complex single-float)
     990                     '(complex double-float)
     991                     '(complex short-float)
     992                     '(complex long-float)
     993                     '(complex float)))
     994              (t
     995               init))))))
    983996
    984997(defun loop-optional-type (&optional variable)
    985998  ;; No variable specified implies that no destructuring is permissible.