unofficial mirror of guile-devel@gnu.org 
 help / color / mirror / Atom feed
From: Tomas Volf <~@wolfsden.cz>
To: Adam Faiz <adam.faiz@disroot.org>
Cc: guile-devel@gnu.org,  Nala Ginrut <nalaginrut@gmail.com>,
	 Ricardo Wurmus <rekado@elephly.net>,
	 Maxime Devos <maximedevos@telenet.be>
Subject: Re: [PATCH v3] rdelim: Add new procedure `for-line-in-file`.
Date: Mon, 16 Dec 2024 12:27:03 +0100	[thread overview]
Message-ID: <87pllrkgvs.fsf@wolfsden.cz> (raw)
In-Reply-To: <c68eaf83-c3f4-3829-6793-5627888b6863@disroot.org> (Adam Faiz's message of "Mon, 16 Dec 2024 16:43:44 +0800")

[-- Attachment #1: Type: text/plain, Size: 2944 bytes --]

Adam Faiz <adam.faiz@disroot.org> writes:

> From fe113e9efc08aae2a7e3792a1018c496212bd774 Mon Sep 17 00:00:00 2001
> From: AwesomeAdam54321 <adam.faiz@disroot.org>
> Date: Sun, 15 Dec 2024 23:48:30 +0800
> Subject: [PATCH v3] rdelim: Add new procedure `for-line-in-file`.
>
> * module/ice-9/rdelim.scm (for-line-in-file): Add it.
>
> This procedure makes it convenient to do per-line processing of a text
> file.
> ---
>  module/ice-9/rdelim.scm | 23 ++++++++++++++++++++++-

It should also be documented in the manual I would think.

>  1 file changed, 22 insertions(+), 1 deletion(-)
>
> diff --git a/module/ice-9/rdelim.scm b/module/ice-9/rdelim.scm
> index d2cd081d7..b4c55c12e 100644
> --- a/module/ice-9/rdelim.scm
> +++ b/module/ice-9/rdelim.scm
> @@ -23,7 +23,8 @@
>  ;;; similar to (scsh rdelim) but somewhat incompatible.
>
>  (define-module (ice-9 rdelim)
> -  #:export (read-line
> +  #:export (for-line-in-file
> +            read-line
>              read-line!
>              read-delimited
>              read-delimited!
> @@ -206,3 +207,23 @@ characters to read.  By default, there is no limit."
>  	      line)
>        (else
>         (error "unexpected handle-delim value: " handle-delim)))))
> +
> +(define* (for-line-in-file file proc

What about naming it for-delimited-in-file and adding #:delims argument?
That would allow reading files that have "lines" terminated with #\nul
instead of just #\newline, which would be handy for processing output of
shell commands (-z, -0, ...).  Delims could default to "\n", so
ergonomics of your use case would not be impacted.

On completely separate note, having (fold|reduce)-delimited-in-file
would be cool too (/me makes a note to write it).

> +                           #:key (encoding #f) (guess-encoding #f))
> +  "Call PROC for every line in FILE until the eof-object is reached.
> +FILE can either be a filename string or an already opened input port.
> +The corresponding port is closed upon completion.
> +
> +The line provided to PROC is guaranteed to be a string."
> +  (let ((port
> +         (if (input-port? file)
> +             file
> +             (open-input-file file
> +                              #:encoding encoding
> +                              #:guess-encoding guess-encoding))))
> +    (let loop ((line (read-line port)))
> +      (cond ((eof-object? line)
> +             (close-port port))

I know you were told that it should close the port, but I am not sure
about it.  It should close the port it opened, but should it also the
one it got?  This will prevent the same port being processed multiple
times, which could be annoying.

> +            (else
> +             (proc line)
> +             (loop (read-line port)))))))

Have a nice day,
Tomas

-- 
There are only two hard things in Computer Science:
cache invalidation, naming things and off-by-one errors.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 853 bytes --]

  reply	other threads:[~2024-12-16 11:27 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-12-16  8:43 [PATCH v3] rdelim: Add new procedure `for-line-in-file` Adam Faiz
2024-12-16 11:27 ` Tomas Volf [this message]
2024-12-16 13:08   ` Nala Ginrut
2024-12-16 11:33 ` Ricardo Wurmus
2024-12-16 12:18   ` Maxime Devos

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/guile/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87pllrkgvs.fsf@wolfsden.cz \
    --to=~@wolfsden.cz \
    --cc=adam.faiz@disroot.org \
    --cc=guile-devel@gnu.org \
    --cc=maximedevos@telenet.be \
    --cc=nalaginrut@gmail.com \
    --cc=rekado@elephly.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).