Clojure 当函数名存储为字符串值时调用函数

Clojure 当函数名存储为字符串值时调用函数,clojure,Clojure,我有一个函数定义为 (defn a [] "Hello") 我有另一个变量b (def b "a") 我想调用字符串值'b'表示的函数,即应调用'a'。我该怎么做 您需要将其转换为符号,然后解析它: user=> ((resolve (symbol b))) "Hello" user=> ((-> b symbol resolve)) "Hello" 只是想澄清一点,这里有一个更详细的解决方案: (let [func (-> b symbol resolve)]

我有一个函数定义为

(defn a [] "Hello")
我有另一个变量b

(def b "a")

我想调用字符串值'b'表示的函数,即应调用'a'。我该怎么做

您需要将其转换为
符号
,然后
解析
它:

user=> ((resolve (symbol b)))
"Hello"

user=> ((-> b symbol resolve))
"Hello"
只是想澄清一点,这里有一个更详细的解决方案:

(let [func (-> b symbol resolve)]
  (func arg1 arg2 arg3)) ; execute the function

谢谢你的回答,我还有一个问题。为什么我也需要“解决”它。为什么我不能做((符号b))?如果我可以直接调用其他符号(a),那么为什么我也不能这样做((符号b))?是否可以使用画眉操作符在表单中传递参数?不,不能“调用”符号。你所谓的“直接调用符号”实际上并不是调用符号。当您执行
(symbol b)
时,您将获得symbol对象,而当您仅执行
a
时,您将获得一个
a
引用的对象,在您的情况下是一个函数。调用symbol对象只有在map中查找键时才有意义:
((symbol“a”){'a1'b2})
返回
1
。而
resolve
函数正好满足您的需要,即尝试解析符号后面的对象。实际上
a
(resolve'a)
表达式几乎是等价的(除了名称空间,但这是另一个主题)。是的,可以将参数传递给所述表单。你注意到双括号了吗?内部调用在返回值方面是等价的,因此这些调用将得到相同的结果:
((解析(符号b))12
((->b符号解析)12)
。事实上,后者是由宏处理器转换成前者的。