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

请求解析Clojure中含reduce函数的代码执行逻辑

对Clojure中reduce这段代码执行逻辑的解释

你的核心误解是对reduce的参数传递逻辑理解错了:reduce不会把整个集合传给x,而是逐个遍历集合里的元素,每次将当前元素赋值给x,同时把上一轮的累加结果赋值给r。

这段代码里reduce的三个参数分别是:

  1. 匿名函数(fn [r x] (if (nil? x) r (conj r x))):负责处理每一轮的累加逻辑
  2. []:初始累加值(也就是第一轮的r)
  3. [:mouse nil :duck nil :lory nil]:要遍历处理的集合

下面是逐轮执行的详细过程:

  1. 第一轮迭代

    • 当前累加值r = [],当前元素x = :mouse
    • 执行判断:nil? :mouse为false,调用(conj [] :mouse),得到新的累加值[:mouse]
  2. 第二轮迭代

    • 当前累加值r = [:mouse],当前元素x = nil
    • 执行判断:nil? nil为true,直接返回当前累加值[:mouse],累加值不变
  3. 第三轮迭代

    • 当前累加值r = [:mouse],当前元素x = :duck
    • 执行判断:nil? :duck为false,调用(conj [:mouse] :duck),得到新的累加值[:mouse :duck]
  4. 第四轮迭代

    • 当前累加值r = [:mouse :duck],当前元素x = nil
    • 执行判断:nil? nil为true,直接返回当前累加值[:mouse :duck],累加值不变
  5. 第五轮迭代

    • 当前累加值r = [:mouse :duck],当前元素x = :lory
    • 执行判断:nil? :lory为false,调用(conj [:mouse :duck] :lory),得到新的累加值[:mouse :duck :lory]
  6. 第六轮迭代

    • 当前累加值r = [:mouse :duck :lory],当前元素x = nil
    • 执行判断:nil? nil为true,直接返回当前累加值[:mouse :duck :lory]

遍历完所有元素后,reduce返回最终的累加值,也就是你看到的[:mouse :duck :lory]。

内容的提问来源于stack exchange,提问作者leydovordu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 12:20:54