'Required argument is not a symbol' let 绑定错误
'Required argument is not a symbol' error in let binding
在下面的代码中,我得到一个 Required argument is not a symbol
错误。
(defconstant +localhost+ (vector 127 0 0 1))
(defun ip-from-hostname (hostname)
(sb-bsd-sockets:host-ent-addresses
(sb-bsd-sockets:get-host-by-name hostname)))
(defun test-connect
(let ((ip (car (ip-from-hostname "www.google.com")))
(socket (make-instance 'sb-bsd-sockets:inet-socket :type :stream :protocol :tcp)))
(sb-bsd-sockets:socket-bind socket +localhost+ 8080)
(sb-bsd-sockets:socket-connect socket ip)
(sb-bsd-sockets:socket-send socket "GET / HTTP/1.1" nil)
(write-line (sb-bsd-sockets:socket-receive socket nil 2048))))
(test-connect)
更完整的错误信息:
Required argument is not a symbol: ((IP
(CAR
(IP-FROM-HOSTNAME "www.google.com")))
(SOCKET
(MAKE-INSTANCE
'SB-BSD-SOCKETS:INET-SOCKET :TYPE
:STREAM :PROTOCOL :TCP)))
我已将问题缩小到调用 ip-from-hostname
的部分,但奇怪的是 REPL 中 let 绑定的简化版本:
(let ((ip (sb-bsd-sockets:host-ent-addresses (sb-bsd-sockets:get-host-by-name "www.google.com"))))
(write-line (write-to-string (car ip))))
我还尝试用它的主体替换 ip-from-hostname
调用,认为它可能与参数有关,但仍然没有成功。有什么想法吗?
(defun test-connect ...
...
应该是一个 lambda 列表,它丢失了。
记住,DEFUN 的语法是:
defun function-name lambda-list
[[declaration* | documentation]]
form*
在下面的代码中,我得到一个 Required argument is not a symbol
错误。
(defconstant +localhost+ (vector 127 0 0 1))
(defun ip-from-hostname (hostname)
(sb-bsd-sockets:host-ent-addresses
(sb-bsd-sockets:get-host-by-name hostname)))
(defun test-connect
(let ((ip (car (ip-from-hostname "www.google.com")))
(socket (make-instance 'sb-bsd-sockets:inet-socket :type :stream :protocol :tcp)))
(sb-bsd-sockets:socket-bind socket +localhost+ 8080)
(sb-bsd-sockets:socket-connect socket ip)
(sb-bsd-sockets:socket-send socket "GET / HTTP/1.1" nil)
(write-line (sb-bsd-sockets:socket-receive socket nil 2048))))
(test-connect)
更完整的错误信息:
Required argument is not a symbol: ((IP
(CAR
(IP-FROM-HOSTNAME "www.google.com")))
(SOCKET
(MAKE-INSTANCE
'SB-BSD-SOCKETS:INET-SOCKET :TYPE
:STREAM :PROTOCOL :TCP)))
我已将问题缩小到调用 ip-from-hostname
的部分,但奇怪的是 REPL 中 let 绑定的简化版本:
(let ((ip (sb-bsd-sockets:host-ent-addresses (sb-bsd-sockets:get-host-by-name "www.google.com"))))
(write-line (write-to-string (car ip))))
我还尝试用它的主体替换 ip-from-hostname
调用,认为它可能与参数有关,但仍然没有成功。有什么想法吗?
(defun test-connect ...
...
应该是一个 lambda 列表,它丢失了。
记住,DEFUN 的语法是:
defun function-name lambda-list
[[declaration* | documentation]]
form*