| 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 | ||||||||||