免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5290 | 回复: 3
打印 上一主题 下一主题

lisp 一个循环没看懂,请教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-07-23 09:55 |只看该作者 |倒序浏览
本帖最后由 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中超过来的

论坛徽章:
2
白羊座
日期:2013-10-29 13:29:222015亚冠之全北现代
日期:2015-10-25 08:13:02
2 [报告]
发表于 2010-07-23 10:12 |只看该作者
从你的第三问看出你应该没必要问第一个问题, 再看看loop的用法及例子吧.
别一下子弄那么复杂!

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


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

论坛徽章:
0
3 [报告]
发表于 2010-07-24 00:50 |只看该作者
从你的第三问看出你应该没必要问第一个问题, 再看看loop的用法及例子吧.
别一下子弄那么复杂!

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



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

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

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

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

再次谢谢您

论坛徽章:
2
白羊座
日期:2013-10-29 13:29:222015亚冠之全北现代
日期:2015-10-25 08:13:02
4 [报告]
发表于 2010-07-24 12:03 |只看该作者
不错,我看漏了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP