在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))

但它们看起来很丑。有没有更好的办法?如果不是,那么以上哪个是最惯用的?

最佳答案

这对我有用,而无需使用eval:

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

之所以有效,是因为resolves在当前 namespace 中找到了mycar var,并且var调用了它所绑定(bind)的函数。这是第一个示例的简短版本。我只是为了避免使用eval而使用它。

10-04 16:11