在Clojure中使用函数名称从字符串调用函数

时间:2010-10-03 09:25:27

标签: clojure

我怎么能用字符串调用函数?例如像这样的东西:

(call "zero?" 1) ;=> false

2 个答案:

答案 0 :(得分:28)

类似的东西:

(defn call [^String nm & args]
    (when-let [fun (ns-resolve *ns* (symbol nm))]
        (apply fun args)))

答案 1 :(得分:15)

一个简单的答案:

(defn call [this & that]
  (apply (resolve (symbol this)) that))

(call "zero?" 1) 
;=> false

只是为了好玩:

(defn call [this & that]
  (cond 
   (string? this) (apply (resolve (symbol this)) that)
   (fn? this)     (apply this that)
   :else          (conj that this)))

(call "+" 1 2 3) ;=> 6
(call + 1 2 3)   ;=> 6
(call 1 2 3)     ;=> (1 2 3)
相关问题