Tôi đang tìm kiếm một cách thành ngữ hơn, nếu có thể, để viết mã clojure sau:cách Idiomatic để viết chức năng NET interop
(import '(System.Net HttpWebRequest NetworkCredential)
'(System.IO StreamReader))
(defn downloadWebPage
"Downloads the webpage at the given url and returns its contents."
[^String url ^String user ^String password]
(def req (HttpWebRequest/Create url))
(.set_Credentials req (NetworkCredential. user password ""))
(.set_UserAgent req ".NET")
(def res (.GetResponse req))
(def responsestr (.GetResponseStream res))
(def rdr (StreamReader. responsestr))
(def content (.ReadToEnd rdr))
(.Close rdr)
(.Close responsestr)
(.Close res)
content
)
Đây là trên ClojureCLR và các công trình. (Thực tế là nó là biến thể CLR không quan trọng nhiều)
Tôi muốn thoát khỏi defs (thay thế bởi phép? Họ có thể tham khảo với nhau?)
Làm thế nào về một cách tốt hơn để truy cập luồng - lưu ý rằng .. chuỗi sẽ không hoạt động vì tôi cần Đóng các luồng sau này.
EDIT: Sau khi trả lời, tôi tìm thấy một cách dễ dàng hơn trong .NET để tải xuống một trang web bằng cách sử dụng lớp WebClient. Tôi vẫn còn sử dụng nhiều phương pháp tiếp cận đề nghị Michal của - chỉ muốn ghi lại những gì bây giờ tôi tin là câu trả lời tốt nhất:
(defn download-web-page
"Downloads the webpage at the given url and returns its contents."
[^String url ^String user ^String password]
(with-open [client (doto (WebClient.)
(.set_Credentials (NetworkCredential. user password "")))]
(.DownloadString client url)))