我是 Clojure 的新手,一直在使用 Compojure 编写一个基本的 Web 应用程序。不过,我在 Compojure 的 defroutes
语法方面遇到了困难,我认为我需要理解这一切背后的“如何”和“为什么”。
这看起来像是 Ring 风格的应用程序从一个 HTTP 请求映射开始,然后只是通过一系列中间件函数传递请求,直到它被转换成一个响应映射,然后被发送回浏览器。这种风格对于开发人员来说似乎太“低级”了,因此需要像 Compojure 这样的工具。我可以看到在其他软件生态系统中也需要更多的抽象,最显著的是 Python 的 WSGI。
问题是我不理解 Compojure 的方法:
(defroutes main-routes
(GET "/" [] (workbench))
(POST "/save" {form-params :form-params} (str form-params))
(GET "/test" [& more] (str "<pre>" more "</pre>"))
(GET ["/:filename" :filename #".*"] [filename]
(response/file-response filename {:root "./static"}))
(ANY "*" [] "<h1>Page not found.</h1>"))
我知道理解所有这些的关键在于一些宏巫术,但是我还没有完全理解宏。我已经盯着 defroutes
源很长时间了,但就是不明白!这是怎么回事?理解“大想法”可能会帮助我回答这些具体的问题:
workbench
function)? For example, say I wanted to access the HTTP_ACCEPT headers or some other part of the request/middleware?{form-params :form-params}
)是怎么回事? 解构时有哪些关键词可用?我真的很喜欢 Clojure,但是我被难住了!