X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fcode%2Fpred.lisp;h=7d006cce2b6bb789a15163a745b7092954b0218b;hb=f2847d6ed16e60390d000410d36ec7fb2570cdaf;hp=6de30db3c106e0e4474d2c43bcc9088b93891f44;hpb=a682f4c392bc874a6a898632889319ebdd8821fc;p=sbcl.git diff --git a/src/code/pred.lisp b/src/code/pred.lisp index 6de30db..7d006cc 100644 --- a/src/code/pred.lisp +++ b/src/code/pred.lisp @@ -24,6 +24,22 @@ (do ((data (%array-data-vector x) (%array-data-vector data))) ((not (array-header-p data)) (simple-vector-p data)))))) +;;; Is X an extended sequence? +(defun extended-sequence-p (x) + (and (not (listp x)) + (not (vectorp x)) + (let* ((slayout #.(info :type :compiler-layout 'sequence)) + (depthoid #.(layout-depthoid (info :type :compiler-layout 'sequence))) + (layout (layout-of x))) + (when (layout-invalid layout) + (setq layout (update-object-layout-or-invalid x slayout))) + (if (eq layout slayout) + t + (let ((inherits (layout-inherits layout))) + (declare (optimize (safety 0))) + (and (> (length inherits) depthoid) + (eq (svref inherits depthoid) slayout))))))) + ;;; Is X a SEQUENCE? Harder than just (OR VECTOR LIST) (defun sequencep (x) (or (listp x)