Erro de Clojure no encadeamento: java.lang.IllegalArgumentException: a chave deve ser um inteiro

Estou intrigado com duas coisas. Um, a mensagem de erro em si. E dois, o fato de esse código gerar tantos encadeamentos. Eu estava pensando que iria girar 2 ou 3 threads em resposta a uma única solicitação, mas quando eu corro isso no localhost e aponto meu navegador para ele (apenas uma vez) ele gira até 40 threads. Evidentemente, eu estava usando o Chrome, que envia três solicitações em segundo plano, por vários motivos complicados que o Google defende como "recurso" (velocidade).

O que esse erro significa?

Exception in thread "Thread-39" java.lang.IllegalArgumentException: Key must be integer
at clojure.lang.APersistentVector.invoke(APersistentVector.java:250)
at serve_pages_from_memory.core$listen_and_respond$fn__51.invoke(core.clj:30)
at clojure.lang.AFn.run(AFn.java:24)
at java.lang.Thread.run(Thread.java:680)

Eu vejo erros semelhantes foram discutidos no StackOverflow antes, mas não vejo como eles se encaixam no meu problema:

mapa do filtro de clojure por chaves

Eu estou tentando construir um aplicativo simples que serve uma página. Eu faço isso principalmente para testar meus conhecimentos sobre o Clojure. Aqui está a maior parte do código:

(defn start-thread [f]
(doto (new Thread f) (.start)))

(defn serve-page [wrt]
(let [content-length (count page-string)] 
(. wrt println "HTTP/1.1 200 OK")
(. wrt println "Content-Type: text/html; charset=UTF-8")
(. wrt println "Connection: Keep-Alive")
(. wrt println (str "Content-Length: " content-length))
(. wrt print "\r\n")
(. wrt print page-string)
(. wrt flush)
(. wrt close)))

(defn listen-and-respond [ss]
(let [client (. ss accept)]
(start-thread #([client]
                  (let [wrt (new PrintWriter (new BufferedWriter (new OutputStreamWriter (. client (getOutputStream)))))]        
                    (serve-page wrt))))))

(defn create-server [port]
(let [ss (new ServerSocket port)]
(start-thread #(when-not (. ss (isClosed))
                 (try (listen-and-respond ss)
                      (catch SocketException e))
                 (recur)))
ss)) 

(defn -main [& args]
(println "Server is starting")
(let [port (Integer/parseInt (first args))]
(create-server port)))

O erro parece estar reclamando sobre esta linha:

                (serve-page wrt))))))

Mas esse é um nome de função e um objeto PrintWriter. A mensagem de erro sugeriria que isso era algo sobre um mapa com chaves. O erro não faz sentido.

Alguma sugestão?

questionAnswers(1)

yourAnswerToTheQuestion