hi, I'm trying to do something slightly harder than what the attached example tries to do, but this example suffices to show that I, evidently, am missing something about how for/fold and/or #:break work together.
(I have used both before, but have gotten out of practice with racket of late and am stuck longer on this than seems reasonable.)
I expect both tests to pass, but both fail (the "j" for jewel in "xxjxx") is seen but not "found", as it were.
I'd be grateful for a bug fix and/or explanation.
Cheers,
Tim Hanson
--------
#lang racket
(require rackunit)
(define (port->char-stream aport)
(printf "(port->char-stream aport)~n")
(define (process-next-ch-iter)
(let ([ch (read-char aport)])
(printf "p->cs ch: ~a~n" ch)
(if (eof-object? ch)
empty-stream
(stream-cons
ch
(process-next-ch-iter)))))
(process-next-ch-iter))
(let ([my-port
(open-input-string "xxjxx")])
(let ([ch-stream (port->char-stream my-port)])
(let-values ([(pos-found? pos)
(for/fold ([j-found? #f]
[pos 0])
(#:break j-found?
;#:final j-found?
[ch ch-stream]
[ch-idx (in-naturals 1)])
(begin
(printf "ch: ~a~n" ch)
(printf "ch-idx: ~a~n" ch-idx)
(printf "(eq? ch #\\j): ~a~n" (eq? ch #\j))
(values
(eq? ch #\j)
ch-idx)))])
(check-equal? pos-found? #t)
(check-equal? pos 3)
(close-input-port my-port))))