You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 09:31:04