The code in the INTEGER branch of the ETYPECASE on LIMIT craps out with floating point exception on NAN's when very large integer limits are requested. The use of LOG and EXPT should be replaced with INTEGER-LENGTH and ASH:
From this....
(integer
(let* ((log-limit (log limit 2)) ;; <-- (A)
(num-bytes (ceiling log-limit 8))
(mask (1- (expt 2 (ceiling log-limit))))) ;; <-- (B)
(loop for random = (logand (ironclad:octets-to-integer
To this...
(integer
(let* ((log-limit (integer-length limit)) ;; <-- (A')
(num-bytes (ceiling log-limit 8))
(mask (1- (ash 1 log-limit)))) ;; <-- (B')
(loop for random = (logand (ironclad:octets-to-integer
The code in the INTEGER branch of the ETYPECASE on LIMIT craps out with floating point exception on NAN's when very large integer limits are requested. The use of LOG and EXPT should be replaced with INTEGER-LENGTH and ASH:
From this.... (integer (let* ((log-limit (log limit 2)) ;; <-- (A) (num-bytes (ceiling log-limit 8)) (mask (1- (expt 2 (ceiling log-limit))))) ;; <-- (B) (loop for random = (logand (ironclad:octets-to-integer
To this... (integer (let* ((log-limit (integer-length limit)) ;; <-- (A') (num-bytes (ceiling log-limit 8)) (mask (1- (ash 1 log-limit)))) ;; <-- (B') (loop for random = (logand (ironclad:octets-to-integer