3

我在 lisp 中的 TCP 客户端上工作,并且在正确读取/打印套接字流时遇到了困难。当客户端向服务器发送数据时,它应该会收到响应,我需要将其写入标准输出。这可以正常工作,除了我遇到响应打印两次的问题。如果我有多个命令被发送,只有最后一个会被打印两次。这是我的代码:

(defun socket-print (string socket)
    (write-line string (usocket:socket-stream socket))
    (force-output (usocket:socket-stream socket)))


(defun socket-read (socket)
    (write-line (read-line (usocket:socket-stream socket) nil)))


(defun mytest (command)
    (let ((socket (usocket:socket-connect _IP_ _PORT_)))
        (socket-print command socket)
        (socket-read socket)))
4

1 回答 1

3

我不认为它会打印两次。我认为它正在打印(通过write-line)一次,然后write-line正在返回该行,而REPL正在打印返回值。例如,如果您修改mytest以返回nil,我想您会看到您期望的输出:

(defun mytest (command)
    (let ((socket (usocket:socket-connect _IP_ _PORT_)))
        (socket-print command socket)
        (socket-read socket)
        nil))

这应该用write-line打印该行,然后返回nil,REPL 将打印nil。将此与以下内容进行比较:

CL-USER> (defun echo (line)
           (write-line line))
ECHO
CL-USER> (echo "hello")
hello
"hello"
CL-USER> (progn
           (echo "hello")
           (echo "world"))
hello
world
"world"
CL-USER> (progn
           (echo "hello")
           (echo "world")
           nil)
hello
world
NIL
CL-USER> (progn
           (echo "hello")
           (echo "world")
           (values))
hello
world
; No value

另见:

于 2015-02-05T21:25:17.517 回答