hi, folks, I posted this question here: https://groups.google.com/g/racket-users/c/LblfrTvKVx4 yestereve, but just discovered this discourse group. I hope it's OK to cross-post here, so to speak.
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.
#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))))