clojure - Clojure Core 函数参数位置似乎相当混乱。其背后的逻辑是什么?
问题描述
对于我作为一个新的 Clojurian 的我来说,当涉及到参数顺序/位置时,一些核心函数似乎相当违反直觉和令人困惑,这里有一个例子:
> (nthrest (range 10) 5)
=> (5 6 7 8 9)
> (take-last 5 (range 10))
=> (5 6 7 8 9)
也许它背后有一些我还没有看到的规则/逻辑?
我拒绝相信 Clojure 核心团队做出了如此多出色的技术决策,却忘记了函数命名/参数顺序的一致性。
还是我应该按原样记住它?
谢谢
有点题外话:
rand
& rand-int
VS random-sample
- 另一个函数命名似乎不一致的例子,但这是一个很少使用的函数,所以没什么大不了的。
解决方案
Clojure.org 上有一个关于这个问题的常见问题解答:https ://clojure.org/guides/faq#arg_order
核心函数中 arg 顺序的经验法则是什么?
主要集合操作数位于第一位。这样就可以写 → 及其同类,它们的位置与它们是否具有可变的参数无关。在 OO 语言和 Common Lisp 中有这样的传统
(slot-value, aref, elt)
。考虑序列的一种方法是从左侧读取它们,并从右侧馈送:
<- [1 2 3 4]
大多数序列函数消耗和产生序列。因此,将其可视化的一种方法是链:
map <- filter <- [1 2 3 4]
考虑许多 seq 函数的一种方法是它们以某种方式参数化:
(map f) <- (filter pred) <- [1 2 3 4]
因此,序列函数最后获取它们的源,以及它们之前的任何其他参数,并且部分允许如上所述的直接参数化。在函数式语言和 Lisp 中有这样的传统。
请注意,这与最后获取主操作数不同。一些序列函数有多个源(concat、interleave)。当序列函数是可变参数时,它通常在它们的源中。
改编自Rich Hickey 的评论。
推荐阅读
- elasticsearch - 我可以在elasticsearch中查询具有不同结构的两个不同索引并合并结果吗?
- react-native - 将地图应用程序与 react-native 应用程序集成
- javascript - 如何找出哪些代码和imgs没有用和多余并删除它
- android - Telegram 和 Twitter 等应用程序如何在不请求位置权限的情况下自动检测国家/地区拨号代码?
- sql - 二进制转换的意外行为(COALESCE 与 ISNULL)
- php - 验证错误!验证检查数据库 phpmyadmin 中是否已存在电子邮件地址
- amazon-web-services - 如何重置aws数据库密码
- bash - && 和 || 的执行顺序 在重击中
- pandas - Pandas 数据框过滤动态列
- git - 如何忽略对现有“build/”目录的不断更改?