Clojure: определите, существует ли функция - PullRequest
9 голосов
/ 10 октября 2011

как я могу узнать, может ли имя функции, представленное в виде строки, вызываться или нет в текущем контексте? что-то вроде:

(callable? "asdasd") ;; false
(callable? "filter") ;; true

спасибо

Ответы [ 3 ]

17 голосов
/ 10 октября 2011

Вы ищете решение,

(resolve (symbol "asd"))

возвращает ноль

(resolve (symbol "filter"))

return # 'clojure.core / filter

Чтобы проверить, является ли переменнаяфункция (кредит переходит к @amalloy):

(-> s symbol resolve deref ifn?)
1 голос
/ 10 октября 2011

Скорее всего, если вам это нужно, вы делаете что-то не так, но ...

(defn callable? 
  [s] 
  (let [obj (try (eval (symbol s)) (catch Exception e))]
  (and obj (fn? obj))))
0 голосов
/ 10 октября 2011
(defn callable? [name]      
   (clojure.test/function? (symbol name)))

UPD. Я обнаружил, что fn? проверяет только интерфейс Fn и не работает для разрешенного символа. Хотя clojure.test/function? делает то, что нужно, поэтому я обновил пример.

...