On Fri, Nov 13, 2015 at 4:51 PM, Mark H Weaver <m...@netris.org> wrote: > > Jan Synáček <jan.syna...@gmail.com> writes: > > > On Sun, Nov 8, 2015 at 12:49 AM, Andreas Rottmann <a.rottm...@gmx.at> > > wrote: > > > > Also note that if there's no requirement to actually implement > > this in > > C, there's `fdes->inport' and `fdes->outport' on the Scheme level, > > so > > something like the following would be analogous to the C example > > code > > posted: > > > > (import (ice-9 binary-ports)) > > > > (define (process-fd fd) > > (let ((port (fdes->inport fd))) > > (display "read: ") > > (display (get-bytevector-n port 100)) > > (display "\n"))) > > > > (process-fd (acquire-valid-fd)) > > > > > > This is something very similar that I ended up with. Just instead of > > get-byte-vector, I used read-string!/partial. > > I would advise against using 'read-string!/partial' or any of the > procedures in (ice-9 rw). This is a vestigial module from Guile 1.8 > when strings were arrays of bytes, which they no longer are. We should > probably mark them as deprecated. > > For one thing, when we switch to using UTF-8 as the internal string > encoding, it will not be possible to keep 'read-string!/partial' > efficient. It will necessarily have to do an encoding conversion. > > In Guile 2+, I would advise using byte vectors when working with binary > data. Portions of these can be converted to strings with a given > encoding if desired. I might be able to give better advice if I knew > more about what you are doing here. > > Regards, > Mark
I have an open fd to a unix socket and I want to read data from it. I know that the data is going to be only strings, but I don't know the length in advance. The good thing about using read-string!/partial is, that I don't have to specify how many bytes I want to read and it does the right thing. If you point me to a better direction, I'll be grateful. I came up with: (for-each (lambda (fd) (let* ((buf (make-string 4096))) (read-string!/partial buf (fdes->inport fd)) (format #t "fd[~a]: ~a" fd buf) (newline))) fds) -- Jan Synáček