Hi! Andy Wingo <[email protected]> skribis:
> On Tue 22 Jan 2013 10:15, Andy Wingo <[email protected]> writes: [...] >> Patch attached. I didn't update the docs because it wasn't clear to me >> that (ice-9 rdelim) is actually the right place to put it. >> >> What do you think? Should we perhaps put it in a new (ice-9 ports)? I would avoid adding a new module, unless there are other things to put in there. >> Are the names right? ‘read-all’ doesn’t convey the idea that it’s textual (unlike the R6RS names). Perhaps ‘port-contents-as-string’, or ‘read-all-string’, or...? > +(define* (read-all! buf #:optional > + (port (current-input-port)) > + (start 0) (end (string-length buf))) > + "Read all of the characters out of PORT and write them to BUF. > +Returns the number of characters read. > + > +This function only reads out characters from PORT if it will be able to > +write them to BUF. That is to say, if BUF is smaller than the number of > +available characters, then BUF will be filled, and characters will be > +left in the port." > + (check-arg buf (string? buf) "not a string") > + (check-arg start (index? start) "bad index") > + (check-arg end (index? end) "bad index") > + (check-arg start (<= start end) "start beyond end") > + (check-arg end (<= end (string-length buf)) "end beyond string length") > + (let lp ((n start)) > + (if (< n end) > + (let ((c (read-char port))) > + (if (eof-object? c) > + (- n start) > + (begin > + (string-set! buf n c) > + (lp (1+ n))))) > + (- n start)))) As you note, this is fairly inefficient, like ‘get-string-n!’. Given that ‘string-set!’ is (unduly) costly, I wonder if consing all the chars and then calling ‘list->string’ wouldn’t be more efficient in time (it’d be less efficient in space.) Thanks! Ludo’.
