Я новичок в Clojure и использовал Compojure для написания базового веб-приложения. Тем не менее, я нажимаю на стену с синтаксисом Compojure defroutes, и я думаю, что мне нужно понять как "как", так и "почему" за всем этим.
Кажется, что приложение Ring-style начинается с карты запросов HTTP, а затем просто передает запрос через ряд функций промежуточного программного обеспечения, пока оно не будет преобразовано в карту ответа, которая будет отправлена обратно в браузер. Этот стиль выглядит слишком "низкоуровневым" для разработчиков, поэтому нужен такой инструмент, как Compojure. Я вижу эту потребность в дополнительных абстракциях в других программных экосистемах, в первую очередь с Python WSGI.
Проблема в том, что я не понимаю подход Compojure. Возьмем следующее defroutes S-выражение:
(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, но просто не понимаю! Что здесь происходит? Понимание "большой идеи", вероятно, поможет мне ответить на эти конкретные вопросы:
-  Как мне получить доступ к среде Ring из маршрутизируемой функции (например, функция workbench)? Например, скажем, я хотел получить доступ к заголовкам HTTP_ACCEPT или какой-либо другой части запроса/промежуточного программного обеспечения?
-  Какая сделка с деструктурированием ({form-params :form-params})? Какие ключевые слова доступны для меня при деструкции?
Мне очень нравится Clojure, но я настолько тупой!
