Read-line из сокет-потока в lisp

Я работаю на TCP-клиенте в lisp, и у меня возникают проблемы с чтением / печатью потока сокетов. Когда клиент отправляет данные на сервер, он должен получить ответ, и мне нужно записать это в стандартный вывод. Это работает правильно, за исключением того, что у меня есть проблема, когда ответ печатается дважды. Если мне отправляется несколько команд, только последняя будет напечатана дважды. Вот мой код:

(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)))

1 ответ

Решение

Я не думаю, что это печатает дважды. Я думаю, что он печатает (через строку записи) один раз, а затем строка записи возвращает строку, а 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

Также см:

Другие вопросы по тегам