希望这对更有经验的人来说是简单的事情。我正在使用clj,并试图传递命令行arg对它(获取一个URL)。我是一个完全的Clojure初学者,但是我已经成功地将args传递给了一个ptintln,它可以工作。
(ns foo.core
(:require [clj-http.client :as client]))
(defn -main
[& args]
(def url (str args))
(println url)
(def resp (client/get url))
(def headers (:headers resp))
(def server (headers "server"))
(println server))错误消息
Ants-MacBook-Pro:target ant$ lein run "http://www.bbc.com"
("http://www.bbc.com")
Exception in thread "main" java.net.MalformedURLException: no protocol: ("http://www.bbc.com")这行得通
(def resp (client/get "http://www.bbc.com"))提前谢谢。
发布于 2014-02-24 00:54:54
args是一个列表,这意味着在它上调用str返回列表的表示形式,包括括号和内部引号,正如您在错误跟踪中看到的那样:
(println (str '("http://www.bbc.com")))
;; prints ("http://www.bbc.com")当然,URL不会以括号和引号开头,这就是JVM告诉您URL格式错误的原因。
您真正想传递给get的不是参数列表的字符串表示,而是第一个参数:
(let [url (first args)]
(client/get url)) ;; Should work!此外,您不应该在函数中使用def调用--它们在名称空间的顶层创建或重新绑定vars,这是不需要的。
您应该使用的是let表单,它创建局部变量(如我的示例中的url )。有关let的更多信息,请查看forms。
我可能会这样构造您的代码:
(defn -main
[& args]
(let [url (first args)
resp (client/get url)
server (get-in resp [:headers "server"])]
(println url)
(println server)))https://stackoverflow.com/questions/21975777
复制相似问题