gpt4 book ai didi

loops - 对 Common LISP `loop for var =` 语法感到困惑

转载 作者:行者123 更新时间:2023-12-02 06:28:29 25 4
gpt4 key购买 nike

我查看了帖子 here关于如何循环文件。我在网上查了几个地方,试图了解这里再次发布的代码中发生了什么:

(defun get-file (filename)
(with-open-file (stream filename)
(loop for line = (read-line stream nil)
while line
collect line)))

这种语法似乎很神秘,而且引用资料也不是很容易理解。根据引用here “七个 for/as 语法中的第四个”,语法是:

for var [type-spec] = expr1 [then expr2]

如果没有expr2,则使用expr1

什么让我困惑:

我迷路了,不知道该问什么,除了它是如何工作的:

      while line
collect line

我不知道如何用其他代码替换它。它看起来根本不像一个列表。我的直觉会告诉我它应该看起来像:

(while line (collect line))

还有,那不也一样:

while line collect line

expr1是什么:

(read-line stream nil)
while line
collect line)

      while line
collect line

如果我有更多代码而不是 collect line 怎么办?不会有 list 吗?我看不到结构。

我知道这些问题不止 1 个,但我可能遗漏了一些重要的东西,这让我无法提出一个好的问题。

最佳答案

这是一个循环。多次运行的东西。

循环基本上有两部分:

  1. 第一部分定义了一个变量 line 以及它会发生什么:在每次循环迭代中 line 被设置为计算表达式 (read-line流零)。这意味着一行一行地被读取。
  2. 第二部分是在每次迭代中运行的子句。这部分说:只要变量 line 不是 nil 就将 line 的值收集到一个列表中。

因此,每一行都被读取,只要有一行,就将它收集到一个列表中。如果到达输入流(即文件流)的末尾,(read-line stream nil) 形式返回 nilwhile 看到 linenilnil 为假,因此循环终止。然后将到目前为止收集的行作为结果返回。

整个loop表单返回收集到的行列表。

这里循环很方便,因为:

  • 它有条件地收集一个值
  • 我们不需要给结果列表一个变量名,因为只有一个累积发生:单个 collect ... 子句。
  • 结果列表以正确的顺序返回:第一个收集的项目是返回列表中的第一个元素

背景

LOOP 通常是一个宏,它是基于 70 年代早期 Interlisp 的类似 FOR 宏。在那里引入了可以像普通英语一样使用程序结构的想法:for item in list collect item。这被称为对话式 Lisp。例如,Applescript 中使用了类似的想法,这是一种来自 Apple 的简单脚本语言。这种风格在 Lisp 中从来没有很流行(尽管有其他宏使用它),但是 loop 宏仍然存在,因为它被证明是有用的。

关于loops - 对 Common LISP `loop for var =` 语法感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48176769/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com