is read-string with custom binary port supported? pasted by klm` on Mon Aug 24 15:47:40 2026

(import chicken.port scheme.base)

;; is read-string with custom binary port supported?

(define (custom-port)
  (let ((p (open-input-bytevector #u8(100 101 102 103 104 105 106 107)))
        (peek #f))
    (make-binary-input-port
     (lambda () (read-u8 p))
     (lambda () (char-ready? p))
     (lambda () (close-input-port p))
     #:peek-u8 #f
     #:read-bytevector
     (lambda (bv start end) (read-bytevector! bv p start end)))))

;; returns (100 #u8(101 102 103) 104) which is great
(with-input-from-port (custom-port)
    (lambda ()
      (list (read-u8) (read-bytevector 3) (read-u8))))

;; changing to read-char still works:
(with-input-from-port (custom-port)
  (lambda ()
    (list (read-char) (read-bytevector 3) (read-char))))

;; changing to read-read seems to break things:
(with-input-from-port (custom-port)
  (lambda ()
    (list (read-char) (read-string 3) (read-char))))

;; changing to read-read seems to break things:
(with-input-from-port (custom-port)
  (lambda ()
    (list (read-u8) (read-string 3) (read-u8))))

revised version added by klm` on Mon Aug 24 15:54:19 2026

(import chicken.port scheme.base)

(define (custom-port)
  (let ((p (open-input-bytevector #u8(100 101 102 103 104 105 106 107)))
        (peek #f))
    (make-binary-input-port
     (lambda () (read-u8 p))
     (lambda () (char-ready? p))
     (lambda () (close-input-port p))
     #:peek-u8 #f
     #:read-bytevector
     (lambda (bv start end) (read-bytevector! bv p start end)))))

;; returns (100 #u8(101 102 103) 104) which is great
(with-input-from-port (custom-port)
    (lambda ()
      (list (read-u8) (read-bytevector 3) (read-u8))))

;; changing to read-char still works, still returns (100 #u8(101 102 103) 104)
(with-input-from-port (custom-port)
  (lambda ()
    (list (read-char) (read-bytevector 3) (read-char))))

;; expected: (#\d "efg" #\h)
;;   actual: (#\d "" #\h)
(with-input-from-port (custom-port)
  (lambda ()
    (list (read-char) (read-string 3) (read-char))))

;; changing to read-u8 seems to break things in the same manner.
;; expected: (100 "efg" 104)
;;   actual: (100 "" 104)
(with-input-from-port (custom-port)
  (lambda ()
    (list (read-u8) (read-string 3) (read-u8))))