diff --git a/collects/scheme/private/for.ss b/collects/scheme/private/for.ss index 4041239658..c658501b74 100644 --- a/collects/scheme/private/for.ss +++ b/collects/scheme/private/for.ss @@ -35,6 +35,7 @@ (rename *in-input-port-chars in-input-port-chars) (rename *in-port in-port) (rename *in-lines in-lines) + (rename *in-bytes-lines in-bytes-lines) in-hash in-hash-keys in-hash-values @@ -489,6 +490,19 @@ "'linefeed, 'return, 'return-linefeed, 'any, or 'any-one" mode)) (in-producer (lambda () (read-line p mode)) eof)])) + + (define in-bytes-lines + (case-lambda + [() (in-bytes-lines (current-input-port) 'any)] + [(p) (in-bytes-lines p 'any)] + [(p mode) + (unless (input-port? p) (raise-type-error 'in-bytes-lines "input-port" p)) + (unless (memq mode '(linefeed return return-linefeed any any-one)) + (raise-type-error + 'in-bytes-lines + "'linefeed, 'return, 'return-linefeed, 'any, or 'any-one" + mode)) + (in-producer (lambda () (read-bytes-line p mode)) eof)])) (define (in-hash ht) (unless (hash? ht) (raise-type-error 'in-hash "hash" ht)) @@ -1255,6 +1269,26 @@ mode*)) (lambda () (read-line p* mode*))) eof)]]))) + + (define-sequence-syntax *in-bytes-lines + (lambda () #'in-bytes-lines) + (lambda (stx) + (syntax-case stx () + [[(id) (_)] #'[(id) (*in-bytes-lines (current-input-port) 'any)]] + [[(id) (_ p)] #'[(id) (*in-bytes-lines p 'any)]] + [[(id) (_ p mode)] + #'[(id) (*in-producer + (let ([p* p] [mode* mode]) + (unless (input-port? p*) + (raise-type-error 'in-bytes-lines "input-port" p*)) + (unless (memq mode* '(linefeed return return-linefeed any + any-one)) + (raise-type-error + 'in-bytes-lines + "'linefeed, 'return, 'return-linefeed, 'any, or 'any-one" + mode*)) + (lambda () (read-bytes-line p* mode*))) + eof)]]))) (define-sequence-syntax *in-input-port-bytes (lambda () #'in-input-port-bytes) diff --git a/collects/scribblings/reference/sequences.scrbl b/collects/scribblings/reference/sequences.scrbl index 6e05b9a45c..9c8279627e 100644 --- a/collects/scribblings/reference/sequences.scrbl +++ b/collects/scribblings/reference/sequences.scrbl @@ -167,6 +167,15 @@ Returns a sequence equivalent to @scheme[(in-port (lambda (p) whereas the default mode of @scheme[read-line] is @scheme['linefeed]. } +@defproc[(in-bytes-lines [in input-port? (current-input-port)] + [mode (or/c 'linefeed 'return 'return-linefeed 'any 'any-one) 'any]) + sequence?]{ + +Returns a sequence equivalent to @scheme[(in-port (lambda (p) +(read-bytes-line p mode)) in)]. Note that the default mode is @scheme['any], +whereas the default mode of @scheme[read-bytes-line] is +@scheme['linefeed]. } + @defproc[(in-hash [hash hash?]) sequence?]{ Returns a sequence equivalent to @scheme[hash]. diff --git a/collects/tests/mzscheme/for.ss b/collects/tests/mzscheme/for.ss index 0a2ac99222..6f89d6d789 100644 --- a/collects/tests/mzscheme/for.ss +++ b/collects/tests/mzscheme/for.ss @@ -135,6 +135,9 @@ (test-generator [((123) 4)] (in-port read (open-input-string "(123) 4"))) (test-generator [(65 66 67)] (in-port read-byte (open-input-string "ABC"))) +(test-generator [("abc" "def")] (in-lines (open-input-string "abc\ndef"))) +(test-generator [(#"abc" #"def")] (in-bytes-lines (open-input-string "abc\ndef"))) + (test-generator [(0 1 2 3 4 5)] (in-sequences (in-range 6))) (test-generator [(0 1 2 3 4 5)] (in-sequences (in-range 4) '(4 5))) (test-generator [(0 1 2 3 4 5)] (in-sequences (in-range 6) '()))