+(defun proper-list-p (x)
+ (unless (consp x)
+ (return-from proper-list-p (null x)))
+ (let ((rabbit (cdr x))
+ (turtle x))
+ (flet ((pop-rabbit ()
+ (when (eql rabbit turtle) ; circular
+ (return-from proper-list-p nil))
+ (when (atom rabbit)
+ (return-from proper-list-p (null rabbit)))
+ (pop rabbit)))
+ (loop (pop-rabbit)
+ (pop-rabbit)
+ (pop turtle)))))
+