lisp 一个循环没看懂,请教

发布于 2022-09-02 23:46:38 字数 4202 浏览 26 评论 3

本帖最后由 xdshting 于 2010-07-23 10:05 编辑

这是cl-ftp里面的一段代码

  1. (defmethod receive-response ((conn ftp-connection) &key (block nil))
  2.   (with-ftp-connection-slots (conn)
  3.     (when (and (not block) (not (data-ready-p conn)))
  4.       (return-from receive-response nil))
  5.     (loop :with initial-line = (read-line (socket-stream socket))
  6.           :with ftp-code = (parse-integer initial-line :end 3)
  7.           :for line = initial-line :then (read-line (socket-stream socket))
  8.           :for line-code = ftp-code :then
  9.                            (when (> (length line) 3)
  10.                              (parse-integer line :end 3
  11.                                             :junk-allowed t))
  12.           :when (and code-cut-off-p (eql line-code ftp-code))
  13.             :collect (subseq line 4) :into lines
  14.           :else
  15.             :collect line :into lines
  16.           :end
  17.           :until (and (eql line-code ftp-code)
  18.                       (char= (char line 3) #Space))
  19.           :finally (let ((data (clean-ftp-response lines)))
  20.                      (log-session conn data)
  21.                      (return (values (maybe-cut-off-code code-cut-off-p
  22.                                                          data
  23.                                                          ftp-code)
  24.                                      ftp-code))))))

复制代码有三个问题

1,这段代码里面的loop循环什么时候退出,我没有看到条件判断

2,在这里with,for前面都加了冒号,是什么原因
另外,我做了一个小测试
(loop  :for cons on '(1 2 3 4 5 6) :do (format t "~a" (car cons)) :when (cdr cons) :do (format t ","))
在关键字for,do,when前面加了冒号,功能没有区别
这条语句中 在for,do,when前面都加了冒号,其功能与没有冒号一样,请问为什么?

3,在我的lisp里面,sbcl,clisp都试验过了,for x=1 then exp,这条语句不能执行,如下是在clisp中,在sbcl中提示then关键字无定义,不知道什么原因,
[2]> (loop for x from 1 to 5
                 for y=0 then z
                 sum 1 into z
                 finally (return (values y z)))

*** - LOOP: illegal syntax near THEN in
       (LOOP FOR X FROM 1 TO 5 FOR Y=0 THEN Z SUM 1 INTO Z FINALLY
        (RETURN (VALUES Y Z)))
The following restarts are available:
ABORT          :R1      ABORT
Break 1 [3]>
这个例子是在ansi common lisp中超过来的

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

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

发布评论

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

评论(3

断舍离 2022-09-09 18:16:30

不错,我看漏了!

卷耳 2022-09-09 10:07:36

从你的第三问看出你应该没必要问第一个问题, 再看看loop的用法及例子吧.
别一下子弄那么复杂!

3. then  ...
miniqq 发表于 2010-07-23 10:12

    谢谢您
1,第一问搞清楚了,until可以跳出循环,一直把他当做unless了

2,还是不明白,难道和keywork包有关系?

3,不是变量定义的问题,在=关键字两边都要有空格,晕,我连在一起了

我在看cl-ftp源代码,遇到问题想不清就上来问问,可能有点钻牛角尖,绝对没有胡闹的意思

再次谢谢您

以歌曲疗慰 2022-09-04 10:15:08

从你的第三问看出你应该没必要问第一个问题, 再看看loop的用法及例子吧.
别一下子弄那么复杂!

3. then 后跟一个有效的表达式, z 未见你定义过,所以出错, 你定义了 z 就没问题了.

有时觉得你的问题是故意整人的!

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