разрешающая функция clojure из строкового имени - PullRequest
12 голосов
/ 04 августа 2010

В clojure 1.2RC1 я хочу получить функцию на основе ее имени в виде строки и оценить ее.

Определение функции

(ns my-ns)

(defn mycar [x] (first x))

Сработало следующее:

((ns-resolve *ns* (symbol "mycar")) '(3 4))
((intern *ns* (symbol "mycar")) '(3 4))
((eval (symbol "mycar")) '(3  4))

но они кажутся безобразными. Есть ли способ лучше? Если нет, то что из перечисленного является наиболее идиоматическим?

1 Ответ

13 голосов
/ 04 августа 2010

Это сработало для меня без использования eval:

user> (defn mycar [x] (first x))
#'user/mycar
user> ((resolve (symbol "mycar")) [1 2 3])
1

Это работает, потому что resolves находит mycar var в текущем пространстве имен, а var вызывает функцию, с которой он связан. Это более короткая версия вашего первого примера. Я бы использовал его только для того, чтобы избежать использования eval.

...