En el compojure library in the core namespace, veo la siguiente forma:clojure: ¿Cuál es el uso de la forma # '/ (var ...)?
(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 [email protected]) request#))))))
y
(defmacro GET "Generate a GET route."
[path args & body]
(compile-route :get path args body))
Más arriba en el archivo, los if-method
y if-route
funciones se definen con defn-
s.
No entiendo el significado del #'
en esta función compile-route
. Los documentos para (var ...)
dicen:
El símbolo debe resolverse en una var, y se devuelve el objeto Var en sí (no su valor). El lector macro # 'x se expande a (var x).
Pero para mí, en el contexto de lo que está sucediendo (es decir, ser llamado desde un defmacro), suena como si significara se devolverá el valor del símbolo, lo que es lo mismo que lo que suena de sustitución como :
(def x 5)
(+ x 7)
-> 12
es decir, (+ x 7)
expande a, o es la misma que, (+ 5 7)
Qué me estoy perdiendo aquí?
Este es exactamente el motivo. – kotarak
¡Gracias por la confirmación! –
Un comentario más: los símbolos no contienen referencias. Vars do. Esta es una diferencia para Lisp, IIUC. Los símbolos son solo nombres y el compilador los resuelve en Vars. El código funciona, porque Var delega todas las llamadas '.invoke' a lo que contiene. – kotarak