Azure Heights
Azure Heights

Reputation: 271

'Required argument is not a symbol' error in let binding

In the following code, I get a Required argument is not a symbol error.

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

More complete error message:

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

I've narrowed down the issue to the section calling ip-from-hostname, but the strange thing is a boiled down version of the let binding works in the REPL:

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

I also tried replacing the ip-from-hostname call with its body thinking that it might be something to do with the arguments, but still no luck. Any thoughts?

Upvotes: 0

Views: 491

Answers (1)

Rainer Joswig
Rainer Joswig

Reputation: 139261

(defun test-connect ...

... should start with a lambda list (the list of parameters), which is missing.

Remember, the syntax for DEFUN is:

defun function-name lambda-list
  [[declaration* | documentation]]
  form*

Upvotes: 6

Related Questions