aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSyndamia <kamen@syndamia.com>2022-12-06 17:43:16 +0200
committerSyndamia <kamen@syndamia.com>2022-12-06 17:43:16 +0200
commit88147fee7e0717f424e821a4c51d4945d1c80a95 (patch)
tree69cd12af11767f52e7115fec0e1073700262e67c /src
parent154bc6d18a69c4d998723c70eb688b0b7c76293b (diff)
downloadsenzill-88147fee7e0717f424e821a4c51d4945d1c80a95.tar
senzill-88147fee7e0717f424e821a4c51d4945d1c80a95.tar.gz
senzill-88147fee7e0717f424e821a4c51d4945d1c80a95.zip
[io] New package io, implemented doread-lines and ask-for-stream
Diffstat (limited to 'src')
-rw-r--r--src/io.lisp19
-rw-r--r--src/packages.lisp6
2 files changed, 25 insertions, 0 deletions
diff --git a/src/io.lisp b/src/io.lisp
new file mode 100644
index 0000000..85e9b31
--- /dev/null
+++ b/src/io.lisp
@@ -0,0 +1,19 @@
+(in-package :senzill.io)
+
+(defmacro doread-lines ((var &key (ends '("end")) read-line-options) &rest body)
+ "Reads lines until NIL or input is inside ends. Each line is stored in var."
+ `(let ((,var (read-line ,@read-line-options)))
+ (loop until (or (member ,var ',ends :test 'string=) (not ,var)) do
+ ,@body
+ (setf ,var (read-line ,@read-line-options)))))
+
+(defmacro ask-for-stream ((var) &rest body)
+ "var is either *standard-input* or file stream, where the file stream is handled by with-open-stream"
+ `(let ((filename))
+ (format t "File name (nothing for *standard-input*): ")
+ (force-output)
+ (setf filename (read-line))
+ (if (string= filename "")
+ (let ((,var *standard-input*))
+ ,@body)
+ (with-open-stream (,var (open filename)) ,@body))))
diff --git a/src/packages.lisp b/src/packages.lisp
index 441101d..802ec3a 100644
--- a/src/packages.lisp
+++ b/src/packages.lisp
@@ -19,3 +19,9 @@
:pop-back
:slice)
(:documentation "List functions"))
+
+(defpackage senzill.io
+ (:use :cl)
+ (:export :doread-lines
+ :ask-for-stream)
+ (:documentation "I/O functions"))