| Allegro CL version 9.0 Unrevised from 8.2 to 9.0. 8.2 version |
Arguments: (sym function &rest args) &body body
with-function-input-stream evalutes body as an implicit progn with sym bound to the stream returned by make-function-input-stream. When control leaves the body, either normally or abnormally (such as by the use of throw), the stream is automatically closed.
See make-function-input-stream for details.
(defun filler (writeto count) (dotimes (n count) (write-byte n writeto)) (close writeto)) (with-function-input-stream (readfrom #'filler 5) (let ((count 0) (sum 0) got) (while (setf got (read-byte readfrom nil nil)) (incf sum got) (incf count)) (format t "Read ~d bytes, totalling ~a~%" count sum)))
(defun head-filter (outstream instream &key (lines 10)) (dotimes (n lines) (let ((line (read-line instream nil nil))) (if (null line) (return)) (write-line line outstream)))) (defun tail-filter (outstream instream &key (lines 10)) (let ((buffer (make-array lines)) (pos 0) (wrapped nil) line) (while (setf line (read-line instream nil nil)) (setf (aref buffer pos) line) (incf pos) (if (= pos lines) (progn (setf pos 0) (setf wrapped t)))) (if wrapped (dotimes (n (- lines pos)) (write-line (aref buffer (+ n pos)) outstream))) (dotimes (n pos) (write-line (aref buffer n) outstream)))) (defun uniq-filter (outstream instream) (let (lastline line) (while (setf line (read-line instream nil nil)) (if (or (not lastline) (string/= line lastline)) (progn (write-line line outstream) (setf lastline line)))))) ;; uniq the last 5 of the first 10 lines of the sourcefile. (defun test-filters (sourcefile) (with-open-file (f sourcefile) (with-function-input-stream (headstream #'head-filter f) (with-function-input-stream (tailstream #'tail-filter headstream :lines 5) (uniq-filter *terminal-io* tailstream)))))
Copyright (c) 1998-2019, Franz Inc. Oakland, CA., USA. All rights reserved.
This page was not revised from the 8.2 page.
Created 2012.5.30.
| Allegro CL version 9.0 Unrevised from 8.2 to 9.0. 8.2 version |