как я могу узнать, может ли имя функции, представленное в виде строки, вызываться или нет в текущем контексте? что-то вроде:
(callable? "asdasd") ;; false (callable? "filter") ;; true
спасибо
Вы ищете решение,
(resolve (symbol "asd"))
возвращает ноль
(resolve (symbol "filter"))
return # 'clojure.core / filter
Чтобы проверить, является ли переменнаяфункция (кредит переходит к @amalloy):
(-> s symbol resolve deref ifn?)
Скорее всего, если вам это нужно, вы делаете что-то не так, но ...
(defn callable? [s] (let [obj (try (eval (symbol s)) (catch Exception e))] (and obj (fn? obj))))
(defn callable? [name] (clojure.test/function? (symbol name)))
UPD. Я обнаружил, что fn? проверяет только интерфейс Fn и не работает для разрешенного символа. Хотя clojure.test/function? делает то, что нужно, поэтому я обновил пример.
fn?
Fn
clojure.test/function?