Hi Adam!
I was confused with the name "file" here since it acts more like a port rather than a filename. If it's expected to be a opened port passed from the caller, it's better rename to "port".

In your context, I think you want to check if it's the end of file, so you may use eof-object?

To make your patch more useful, IMHO, you may support filename string and file port both.  And close the port properly when it's end.

Best regards.

On Mon, Dec 16, 2024, 12:06 Adam Faiz <adam.faiz@disroot.org> wrote:
From 3c7e1af1f4812d0e4c5d10e841cf9546e5ba2887 Mon Sep 17 00:00:00 2001
From: AwesomeAdam54321 <adam.faiz@disroot.org>
Date: Sun, 15 Dec 2024 23:48:30 +0800
Subject: [PATCH v1] 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 | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/module/ice-9/rdelim.scm b/module/ice-9/rdelim.scm
index d2cd081d7..833639219 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,12 @@ 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)
+  "Call PROC for every line in FILE until the eof-object is reached.
+The line provided to PROC is guaranteed to be a string."
+  (while #t
+    (let ((line (read-line file)))
+      (if (string? line)
+          (proc line)
+          (break)))))
--
2.41.0