[gambit-list] input-port-byte-position
Marc Feeley
feeley at iro.umontreal.ca
Tue Oct 17 20:31:59 EDT 2006
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
On 17-Oct-06, at 7:48 PM, John MacFarlane wrote:
> Thanks for your quick response. Here's what I'm seeing now, after
> recompiling with the changes you suggested:
>
> % gsi/gsi
> Gambit Version 4.0 beta 20
>
>> (define f (open-input-file "README"))
>> (input-port-byte-position f)
> 0
>> (read-char f)
> #\R
>> (input-port-byte-position f)
> 1024
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-----
More information about the Gambit-list
mailing list