将字符串转换为不在clojure中的命名空间中的函数

M S*_*ith 3 clojure

以下是我想要开始工作的示例代码:

(letfn [(CONC [f] f)
        (CONT [f] (str "\newline" f))]
((voodoo "CONC") "hamster"))
Run Code Online (Sandbox Code Playgroud)

是否有一些voodo会让它以仓鼠为参数调用CONC函数?也就是说,有没有办法将字符串"CONC"转换为未绑定到命名空间而不是绑定到本地绑定的函数?

编辑:

更清楚的是,这将被称为:

(map #((voodoo (:tag %)) (:value %)) 
    [ 
        {:tag "CONC" :value "hamster"} 
        {:tag "CONT" :value "gerbil"}
    ]
)
Run Code Online (Sandbox Code Playgroud)

mik*_*era 6

我可能通过创建一个由字符串索引的函数映射来解决这个问题:

(def voodoo 
  {"CONC" (fn [f] f)
   "CONT" (fn [f] (str "\newline" f))})
Run Code Online (Sandbox Code Playgroud)

那么你想要的代码应该直接工作(利用map是一个查找它的参数的函数这一事实)

(map #((voodoo (:tag %)) (:value %)) 
    [ 
        {:tag "CONC" :value "hamster"} 
        {:tag "CONT" :value "gerbil"}
    ]
)
Run Code Online (Sandbox Code Playgroud)

请注意,这里的函数是完全匿名的 - 您不需要在命名空间中的任何位置引用它们以使其工作.在我看来这是一件好事,因为除非你还需要其他地方的功能,否则最好避免过多地污染你的顶级命名空间.