以下是我想要开始工作的示例代码:
(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)
我可能通过创建一个由字符串索引的函数映射来解决这个问题:
(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)
请注意,这里的函数是完全匿名的 - 您不需要在命名空间中的任何位置引用它们以使其工作.在我看来这是一件好事,因为除非你还需要其他地方的功能,否则最好避免过多地污染你的顶级命名空间.