lisp 一个循环没看懂,请教
本帖最后由 xdshting 于 2010-07-23 10:05 编辑
这是cl-ftp里面的一段代码
- (defmethod receive-response ((conn ftp-connection) &key (block nil))
- (with-ftp-connection-slots (conn)
- (when (and (not block) (not (data-ready-p conn)))
- (return-from receive-response nil))
- (loop :with initial-line = (read-line (socket-stream socket))
- :with ftp-code = (parse-integer initial-line :end 3)
- :for line = initial-line :then (read-line (socket-stream socket))
- :for line-code = ftp-code :then
- (when (> (length line) 3)
- (parse-integer line :end 3
- :junk-allowed t))
- :when (and code-cut-off-p (eql line-code ftp-code))
- :collect (subseq line 4) :into lines
- :else
- :collect line :into lines
- :end
- :until (and (eql line-code ftp-code)
- (char= (char line 3) #Space))
- :finally (let ((data (clean-ftp-response lines)))
- (log-session conn data)
- (return (values (maybe-cut-off-code code-cut-off-p
- data
- ftp-code)
- 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
不错,我看漏了!
谢谢您
1,第一问搞清楚了,until可以跳出循环,一直把他当做unless了
2,还是不明白,难道和keywork包有关系?
3,不是变量定义的问题,在=关键字两边都要有空格,晕,我连在一起了
我在看cl-ftp源代码,遇到问题想不清就上来问问,可能有点钻牛角尖,绝对没有胡闹的意思
再次谢谢您
从你的第三问看出你应该没必要问第一个问题, 再看看loop的用法及例子吧.
别一下子弄那么复杂!
3. then 后跟一个有效的表达式, z 未见你定义过,所以出错, 你定义了 z 就没问题了.
有时觉得你的问题是故意整人的!