From: Bruce Krulwich
Subject: Re: Generate&Test in lisp
Date: 
Message-ID: <KRULWICH.91Nov13114708@zowie.ils.nwu.edu>
·······@kochab.anu.oz.au (Dharmendra Sharma) writes:
    Given a sequence, I would like to generate its subsequences one at a
    time until some condition is met by a subsequence. Could someone please
    suggest how a function could be written in common lisp to do this.

Wow.  Great morning procrastination project.

Below is one version.  It uses displaced arrays to avoid copying the contents
of the sequence.

(defun subseq-looper (seq test)
  (let* ((vec (concatenate 'vector seq))
	 (len (length vec)))
    (labels ((looper (start end)
	       (let* ((sub-len (1+ (- end start)))
		      (sub-seq (make-array sub-len
					   :displaced-to vec
					   :displaced-index-offset start)))
		 (let ((result (funcall test sub-seq)))
		   (cond (result
			  (copy-seq sub-seq))
			 ((= (1+ end) len)
			  (if (= (1+ start) len)
			      nil
			      (looper (1+ start) (1+ start))))
			 (t ; else
			  (looper start (1+ end))))))))
      (looper 0 0))))


> (subseq-looper '#(1 2 3 4)
		 #'(lambda (ss)
		     (format t "~%Subseq=~{~A~}"
		       (concatenate 'list ss))
		     (equalp ss '#(2 3))))

Subseq=1
Subseq=12
Subseq=123
Subseq=1234
Subseq=2
Subseq=23
#<Vector T 2 EBEC2E>
>


Enjoy.

Bruce Krulwich
Institute for the Learning Sciences
········@ils.nwu.edu