Clojure技术问询:如何将映射的键作为函数应用到对应值?
问题分析
原代码返回(nil nil nil)的核心问题在于:
- 把关键字转成
symbol后直接调用,符号本身不是可执行的函数,必须先解析为对应的函数引用 - 即使生成了正确的符号,当前上下文也无法直接将符号关联到
clojure.core里的实际函数,导致调用失败返回nil
正确实现方式
核心思路是正确获取关键字对应的函数引用,再将其应用到对应的值上,以下是几种可行写法:
方法一:用resolve解析符号(推荐)
(def mm {:inc 1 :dec 2 :identity "three"}) (map (fn [[k v]] ((resolve (keyword->symbol k)) v)) mm) ;; 输出:(2 1 "three")
说明:
keyword->symbol把:inc这类关键字转成'inc符号resolve会在当前默认命名空间(clojure.core)中找到符号对应的函数var,deref后就是可直接调用的函数- 用解构
[[k v]]直接提取键值对,比first+get的写法更清晰
方法二:指定命名空间获取函数
如果需要明确限定函数来自clojure.core(避免命名空间冲突),可以用ns-resolve:
(map (fn [[k v]] ((ns-resolve 'clojure.core (keyword->symbol k)) v)) mm)
方法三:用intern直接获取函数
另一种获取命名空间中函数的方式:
(map (fn [[k v]] ((intern 'clojure.core (keyword->symbol k)) v)) mm)
简化写法
如果喜欢更紧凑的匿名函数写法,也可以这样写:
(map #((resolve (keyword->symbol (first %))) (second %)) mm)
不过解构写法的可读性更强,建议优先使用。
内容的提问来源于stack exchange,提问作者silian-rail
相关产品推荐
相关产品推荐

