Я хотел бы получить имя var, определенное вне функции, изнутри функции. Имя должно быть именем, которое я использовал в области исходного определения, а не вложенными привязками, где я фактически пытаюсь использовать это имя.Как получить имя аргумента в Clojure?
Так что я хотел бы сделать что-то вроде (академический пример):
(defn f1 [x1] (println "hello, you passed var name >>" (get-var-name x1) "<<")
(defn f2 [x2] (f1 x2))
(defn f3 [x3] (let [zzz x3] (f2 zzz))
(def my-var 3.1414926)
(f3 my-var)
user> hello, you passed var name >>my-var<<
Я могу сделать этот макрос на основе некоторых вещей я нашел:
(defmacro get-var-name [x]
`(:name (meta (var ~x))))
Это работает при вызове например, из РЕПЛ, но компилятор дроссели, когда вызывается из «внутри» области видимости, например
(defn another-func [y]
(get-var-name y))
компилятор говорит «, говоря U nable для разрешения var y ". (macroexpand...)
показывает, что он пытается найти локальную переменную y в текущем пространстве имен, а не исходную переменную в текущем пространстве имен. Я думаю, (var...
) ищет только пространства имен, поэтому это предотвращает работу макроса как внутри функции, так и с помощью другой привязки, такой как let
.
I думаю, Я застрял, чтобы вручную получить имя переменной из той же области, где я определяю переменную и передаю ее в качестве дополнительного параметра. Есть ли более элегантный способ передать информацию имени var через цепочку привязок до точки, где она используется? Это было бы плохой зад.
благодаря
Это, сто раз это. Другие ответы (до сих пор) согласуются с предположением автора вопроса о том, что вары задействованы и фактически работают, что не так (как показывает последний пример в вопросе). – amalloy