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

Clojure函数向量迭代疑问:匿名函数%含义及count嵌套执行问题

拆解Clojure stats函数的两个困惑

嘿,我来帮你把这个示例里的疑问掰明白,其实核心就是Clojure里函数是一等公民这个特性,咱们一步步看:

1. 匿名函数里的%到底指代什么?

先看stats函数里的关键代码:

(map #(% numbers) [sum count avg])

这里的#(% numbers)是Clojure的匿名函数简写,展开成完整的匿名函数是这样的:

(fn [func] (func numbers))

哦!原来这里的%指代的是函数集合里的每个函数本身——也就是sum、count、avg这三个函数。

map会遍历[sum count avg]这个向量,把每个函数依次传给这个匿名函数:

  • 第一次迭代:%是sum,执行(sum numbers),算出总和;
  • 第二次迭代:%是count,执行(count numbers),得到元素个数;
  • 第三次迭代:%是avg,执行(avg numbers),算出平均值。

所以stats最终返回的就是这三个函数作用在numbers上的结果集合。

2. 为什么stats能遍历到count?

因为在Clojure里,内置函数和你自己定义的函数地位完全平等——它们都是可以被传递、被当作参数使用的一等公民。

你定义的sum、avg是函数,Clojure自带的count同样是函数,所以把它放进[sum count avg]这个向量里,和另外两个自定义函数没有任何区别。当map遍历到它时,就会像调用sum、avg一样,用它来处理numbers参数,自然就能得到元素数量了。

再用示例验证一遍

比如调用(stats [3 4 10]),实际执行流程是:

  1. 遍历[sum count avg],第一个元素是sum,执行(sum [3 4 10]) → 17;
  2. 第二个元素是count,执行(count [3 4 10]) → 3;
  3. 第三个元素是avg,执行(avg [3 4 10]) → 17/3;
  4. 最后把这三个结果打包成序列返回,就是(17 3 17/3),和示例完全一致。

内容的提问来源于stack exchange,提问作者Mr. Robot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:13:32