|
148 | 148 | ,@body |
149 | 149 | (get-output-stream-string ,var))) |
150 | 150 |
|
151 | | -#| |
152 | | -;;; replace sequences - http://clhs.lisp.se/Body/f_replac.htm |
153 | | -;;; string <- string |
154 | | -;;; vector <- vector |
155 | | -;;; otherwise =>error |
156 | | -
|
157 | | -(defun %replace-seq-eql (x y) |
158 | | - (typecase x |
159 | | - (number (and (numberp y) (= x y))) |
160 | | - (character (and (characterp y) (char-equal x y))) |
161 | | - (string |
162 | | - (and (stringp y) |
163 | | - (equal x y) )) |
164 | | - (vector |
165 | | - (and (vectorp y) |
166 | | - (let ((lex (length x))) |
167 | | - (= lex (length y)) |
168 | | - (dotimes (i lex t) |
169 | | - (when (not (%replace-seq-eql (aref x i) (aref y i))) |
170 | | - (return nil)))))) |
171 | | - (t (equal x y)))) |
172 | | -
|
173 | | -(defun %replace-seq (seq-1 seq-2 start1 end1 start2 end2) |
174 | | - (let* ((trimed-end (min (- end1 start1) (- end2 start2))) |
175 | | - (back nil)) |
176 | | - (setq end1 (+ start1 trimed-end) |
177 | | - end2 (+ start2 trimed-end)) |
178 | | - ;; set copy bacward flag |
179 | | - (when (and (%replace-seq-eql seq-1 seq-2) |
180 | | - (<= start2 start1) |
181 | | - (or (and (<= start1 start2) (< start2 end1)) |
182 | | - (and (< start1 end2) (<= end2 end1)) |
183 | | - (and (<= start2 start1) (< start1 end2)) |
184 | | - (and (< start2 end1) (<= end1 end2)))) |
185 | | - (when (eq start1 start2) |
186 | | - ;; nothing to copy |
187 | | - (return-from %replace-seq seq-1)) |
188 | | - (setq back t)) |
189 | | - (cond (back |
190 | | - (dotimes (i trimed-end seq-1) |
191 | | - (setf (aref seq-1 (- (+ start1 trimed-end) i 1)) |
192 | | - (aref seq-2 (- (+ start2 trimed-end) i 1))))) |
193 | | - (t |
194 | | - (dotimes (i trimed-end seq-1) |
195 | | - (setf (aref seq-1 (+ start1 i)) |
196 | | - (aref seq-2 (+ start2 i)))))) |
197 | | - )) |
198 | | -
|
199 | | -(defun replace (sequence-1 |
200 | | - sequence-2 |
201 | | - &key (start1 0) |
202 | | - (end1 (length sequence-1)) |
203 | | - (start2 0) (end2 (length sequence-2))) |
204 | | - (let ((compatible-types-replace (eql (array-element-type sequence-1) |
205 | | - (array-element-type sequence-2))) |
206 | | - (region-nondecreasing-order-seq-1 (<= 0 start1 end1 (length sequence-1))) |
207 | | - (region-nondecreasing-order-seq-2 (<= 0 start2 end2 (length sequence-2)))) |
208 | | - (assert compatible-types-replace) |
209 | | - ;; check region monotonically nondecreasing order |
210 | | - (assert region-nondecreasing-order-seq-1) |
211 | | - (assert region-nondecreasing-order-seq-2)) |
212 | | - (%replace-seq sequence-1 sequence-2 start1 end1 start2 end2)) |
213 | | -|# |
214 | 151 |
|
215 | 152 | ;;; EOF |
0 commit comments