0

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?

1 Answer 1

6
(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*
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.