[plt-scheme] confusing behavior with "reencode-input-port"
I'm confused about a behavior of "reencode-input-port".
If the input is a port created with "open-input-bytes", then it works as
expected.
If the input port is created with "open-input-string", however, then
"reencode-input-port" has an effect that looks like the input is being
*doubly* reencoded.
I have reduced my confusion to the below demonstration code. Perhaps
someone else can immediately see what I am doing wrong?
(require mzlib/port)
;; First, these two expressions are as expected.
(bytes->list
(read-bytes 1000
(open-input-string (bytes->string/latin-1 (bytes 169)))))
;; ==> (194 169)
(char->integer
(read-char (open-input-string (bytes->string/latin-1 (bytes 169)))))
;; ==> 169
;; The following is what is confusing.
(define (foo in-port)
(let* ((re-in-port (reencode-input-port
in-port ; in
"ISO-8859-1" ; encoding
#f ; error-bytes
#f ; close?
"foo" ; name
#f ; convert-newlines?
)))
(begin0 (bytes->list (read-bytes 1000 re-in-port))
(close-input-port re-in-port))))
(let ((in-bytes (bytes 169)))
`((BYTES-INPUT-PORT
(input ,(bytes->list in-bytes))
(output ,(foo (open-input-bytes in-bytes))))
(STRING-INPUT-PORT
,@(let* ((in-str (bytes->string/latin-1 in-bytes)))
`((input ,(bytes->list (string->bytes/latin-1 in-str)))
(output ,(foo (open-input-string in-str))))))))
;; ==>
;; ((BYTES-INPUT-PORT (input (169)) (output (194 169)))
;; (STRING-INPUT-PORT (input (169)) (output (195 130 194 169))))