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
Также см:
- Как мне избежать ноля, напечатанного в конце?
- запретить вывод терминала в LISP
- Когда вы вводите "привет, мир" в Clojure REPL, почему он говорит "ноль"? (не Common Lisp, но та же концепция)