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)
。事实上,后者是由宏处理器转换成前者的。