Kev*_*vin 1 c++ functional-programming clojure
c ++ boost绑定库和clojure的部分功能非常相似.例如:
int x = 8;
bind(std::less<int>(), _1, 9)(x); // x < 9
Run Code Online (Sandbox Code Playgroud)
这类似于clojure的部分功能:
((partial > 9) 8)
Run Code Online (Sandbox Code Playgroud)
区别在于partial只允许绑定前n个参数,而boost::bind允许占位符指示哪些参数绑定以及哪些参数未绑定.所以boost::bind实际上更通用和有用:
bind(f, _2, _1)(x, y); // f(y, x)
bind(g, _1, 9, _1)(x); // g(x, 9, x)
Run Code Online (Sandbox Code Playgroud)
我想知道boost::bind在clojure(或clojure-contrib)中是否有类似的东西?为什么部分不是按原样编写为更通用(和有用)boost::bind?
这是一个经常被问到的关于Clojure的问题,更常见的是关于线程宏 - >和 - >>关于为什么它们也不允许任意占位符.
在我看来,给出这些原因的原因也适用于:惯用的Clojure函数通常会分解为可以将它们的第一个或最后一个参数单独提供而不是混合的.
换句话说,开发人员通常会尝试编写函数,以便它们适合 - >, - >>和/或部分.
鉴于匿名函数的读者宏,在需要时创建占位符版本相当容易,因为不太惯用的情况:
#(f %2 %1) ;; bind(f, _2, _1)
#(g % 9 %) ;; bind(g, _1, 9, _1)
Run Code Online (Sandbox Code Playgroud)