Many thanks for the clear explanation. That solves my problem. For what it's worth, I do think it would be more useful if input-port-byte-position took into account the position in the byte buffer. I want to be able to store a position in a file and return to it later, and it would be nice if I could do this independently of whether buffering is used.
John
+++ Marc Feeley [Oct 17 06 20:31 ]:
You are witnessing the effect of the buffering. The "byte-position" is the read/write position of the device (a file in this case). At the first read-char, the system will read 1024 bytes into the read buffer. So if you ask for the byte position you will get 1024. The byte position will change after the 1024 bytes have been consumed by a sufficient number of read-chars (or other input operation). The behavior you expected can be obtained by turning the buffering off:
Gambit Version 4.0 beta 20
(define f (open-input-file (list path: "README" buffering: #f))) (input-port-byte-position f)
0
(read-char f)
#\R
(input-port-byte-position f)
1
(read-char f)
#\E
(input-port-byte-position f)
2
(read-char f)
#\A
(input-port-byte-position f)
3
(input-port-byte-position f 0)
0
(read-char f)
#\R
(input-port-byte-position f)
1
Of course the I/O operations will be significantly slower when buffering is off.
It is still not clear to me if this is the proper way of reporting the "byte-position". Gambit has two levels of buffering, a byte buffer and a character buffer. When the byte buffer is empty, an input operation is performed on the device to fill the byte buffer. When the character buffer is empty, the byte buffer is used to fill the character buffer (and a byte to character conversion is performed). The byte position cannot take into account the position in the character buffer because the decoding of bytes to characters may be many to one in general. However the byte position could take into account the position in the byte buffer, which may be more useful than the byte position of the device. I'd appreciate feedback on this issue.
Marc
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.3 (Darwin)
iD8DBQFFNXX///V9Zc2T/v4RAmyrAKC8hTQQ8BlzJ51BUwqc9sS/v4LltQCgvhcJ llsok9oXZ102kblvQcBw0YQ= =eLfQ -----END PGP SIGNATURE-----