clojure: Какая польза от формы '' (var ...)? - PullRequest
6 голосов
/ 28 марта 2011

В библиотеке compojure в основном пространстве имен я вижу следующую форму:

(defn- compile-route
  "Compile a route in the form (method path & body) into a function."
  [method route bindings body]
  `(#'if-method ~method
     (#'if-route ~(prepare-route route)
       (fn [request#]
         (let-request [~bindings request#]
           (render (do ~@body) request#))))))

и

(defmacro GET "Generate a GET route."
  [path args & body]
  (compile-route :get path args body))

Далее в файлеФункции if-method и if-route определяются с помощью defn- s.

Я не понимаю значения #' в этой функции compile-route.Документы для (var ...) говорят:

Символ должен преобразовываться в var, и возвращается сам объект Var (не его значение).Макрос читателя # 'x расширяется до (var x).

Но для меня, в контексте того, что происходит (т.е. вызывается из defmacro), это просто звучит так, как будто это означаетсимвола будет возвращено, что аналогично тому, как звучит заменяемость:

(def x 5)
(+ x 7)
-> 12

т.е. (+ x 7) расширяется до или совпадает с (+ 5 7)

Чтоя здесь скучаю?

Ответы [ 2 ]

4 голосов
/ 29 марта 2011

Посмотрев на это некоторое время, я начинаю подозревать, что это как-то связано с тем фактом, что функции if-method и if-route на самом деле являются частными ((defn- if-route ...)).

Кроме того, для макросов, когда вы заключаете в кавычки обратный тик ("` "), вы на самом деле получаете полностью указанный в пространстве имен символ в конечном расширении:

`(+ 2 3)

расширится до

(clojure.core/+ 2 3)

Поскольку эти методы являются закрытыми, они не будут доступны при обычном расширении, поэтому используется функция var, чтобы добраться до символа, который содержит ссылку на фактическую функцию, которая должна быть вызвана в этой точке.в расширении.

3 голосов
/ 28 марта 2011

ring-reload может перезагрузить определения var из файлов, которые вы изменяете во время разработки. Поскольку вы передаете (var ...), оно разрешается каждый раз, когда вы пытаетесь его прочитать, и, как следствие, перезагруженные переменные могут быть перечитаны при каждом запросе. Это приводит к интерактивной веб-разработке (без необходимости компиляции и т. Д.). Если вы не используете (var ...) и скорее передаете значение напрямую, то перезагруженные переменные не будут переданы в обработчики URI кольца и, следовательно, вы не сможете просто измените и запустите ваш код.

Проверьте эту запись в блоге, например:

http://charsequence.blogspot.com/2010/09/interactive-web-development-with.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...