- 論壇徽章:
- 0
|
本帖最后由 xdshting 于 2010-07-20 16:14 編輯
1,
(defmacro with-connected-socket ((var socket) &body body)
"Bind `socket' to `var', ensuring socket destruction on exit.
`body' is only evaluated when `var' is bound to a non-null value.
The `body' is an implied progn form."
`(let ((,var ,socket))
(unwind-protect
(when ,var
(with-mapped-conditions (,var)
,@body))
(when ,var
(socket-close ,var)))))
紅色的部分,沒看出是什么意思
為什么要把,socket復制給var?
難道不復制就不能保證socket關閉( ensuring socket destruction on exit.)?
2,
(defun test-close ()
(let ( (in (open "/home/linpeng/text" ))
(format t "~a" (read-line in))
(let ((in2 in))
(format t "~a" (read-line in2))
(close in2)
(format t "~a" (read-line in2))) ;;;這里可以讀文件,奇怪,上面明明關掉了,下面同樣
(format t "~a" (read-line in))
(close in)
(format t "~a" (read-line in))))
這里,我是想模擬上面那個宏的操作,但是發(fā)現(xiàn),close根本沒用,close之后,“文件描述符”依然可用,不知道是為什么?
謝謝
3,
其實這里我想問的根本問題是,“文件描述符”是怎么傳遞的,
比如在第二個例子中,用(let ((in2 in)))來吧in復制給in2,如果按照引用傳遞(in2,in指向相同的值)來理解,當close(in2) 只后,應該不能再在使用in讀取文件了,但結(jié)果相反,更夸張的是還能用in2繼續(xù)讀取,就像close沒起做用一樣
環(huán)境是最新的sbcl
另外,問一個問題
在包的定義中
(defpackage # rg.mapcar.ftp.client
(:use #:common-lisp
#:split-sequence
#:usocket)
(:nicknames #:ftp.client #:ftp)
(:export #:ftp-connection
#:with-ftp-connection
#:connect-to-server))
前面的#:是什么作用?謝謝 |
|