如何在 Lisp 中读取输入直到 EOF

发布于 2024-08-02 10:22:19 字数 506 浏览 8 评论 0原文

在 Lisp 中如何读取输入流直到 EOF?在 C 中,您可能会这样做:

while ((c = getchar()) != EOF)
{
  // Loop body...
}       

我希望能够将数据通过管道传输到我的 Lisp 程序,而不必提前指定数据大小。这是我现在正在做的事情的一个例子:

(dotimes (i *n*)
  (setf *t* (parse-integer (read-line) :junk-allowed T))
  (if (= (mod *t* *k*) 0) (incf *count*)))

在这个循环中,变量 *n* 指定我通过管道传输到程序的行数(该值是从输入的第一行读取的) ),但我想只处理任意且未知数量的行,在到达流末尾时停止。

How do I read an input stream until EOF in Lisp? In C, you might do it like this:

while ((c = getchar()) != EOF)
{
  // Loop body...
}       

I would like to be able to pipe data to my Lisp programs without having to specify the data size in advance. Here's an example from something I'm doing now:

(dotimes (i *n*)
  (setf *t* (parse-integer (read-line) :junk-allowed T))
  (if (= (mod *t* *k*) 0) (incf *count*)))

In this loop, the variable *n* specifies the number of lines I'm piping to the program (the value is read from the first line of input), but I would like to just process an arbitrary and unknown number of lines, stopping when it reaches the end of the stream.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

若沐 2024-08-09 10:22:19

请参阅 HyperSpec 的 READ-LINE

(loop for line = (read-line stream nil :eof) ; stream, no error, :eof value
      until (eq line :eof)
      do ... )

或有时使用 nil

(loop for line = (read-line stream nil nil)
      while line
      do ... )

See the HyperSpec for READ-LINE

(loop for line = (read-line stream nil :eof) ; stream, no error, :eof value
      until (eq line :eof)
      do ... )

or sometimes with nil

(loop for line = (read-line stream nil nil)
      while line
      do ... )
一江春梦 2024-08-09 10:22:19

read-line 采用可选参数 (eof-error-p),允许它返回 NIL(默认)或用户指定的值(eof-value) 在遇到 EOF 时,而不是发出错误信号。

来自 《成功的 Lisp》第 19 章< /a>:

READ-LINE &可选流 eof-error-p eof-value recursive-p

在上面列出的读取函数中,可选参数 EOF-ERROR-PEOF-VALUE 指定当您的程序尝试从耗尽的流中读取时会发生什么情况。如果 EOF-ERROR-P 为 true(默认值),那么 Lisp 将在尝试读取耗尽的流时发出错误信号。如果 EOF-ERROR-P 为 NIL,则 Lisp 返回 EOF-VALUE(默认为 NIL)而不是发出错误信号。

您可以使用它作为函数的简单终止条件。

read-line takes an optional argument (eof-error-p) allowing it to return either NIL (default) or a user-specified value (eof-value) on hitting an EOF, instead of signalling an error.

From Chapter 19 of Successful Lisp:

READ-LINE &optional stream eof-error-p eof-value recursive-p

In the read functions listed above, optional arguments EOF-ERROR-P and EOF-VALUE specify what happens when your program makes an attempt to read from an exhausted stream. If EOF-ERROR-P is true (the default), then Lisp will signal an error upon an attempt to read an exhausted stream. If EOF-ERROR-P is NIL, then Lisp returns EOF-VALUE (default NIL) instead of signalling an error.

You can use this as a simple termination condition for your function.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文