Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c++;boost::bind vs clojure部分函数 C++的Boost结合库和Culjure的部分函数非常相似。例如: int x = 8; bind(std::less<int>(), _1, 9)(x); // x < 9_C++_Clojure_Functional Programming - Fatal编程技术网

c++;boost::bind vs clojure部分函数 C++的Boost结合库和Culjure的部分函数非常相似。例如: int x = 8; bind(std::less<int>(), _1, 9)(x); // x < 9

c++;boost::bind vs clojure部分函数 C++的Boost结合库和Culjure的部分函数非常相似。例如: int x = 8; bind(std::less<int>(), _1, 9)(x); // x < 9,c++,clojure,functional-programming,C++,Clojure,Functional Programming,不同之处在于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) 我想知道clojure(或clojure contrib)中是否有类似于boost::bind的东西?为什么不像b

不同之处在于
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) 

我想知道clojure(或clojure contrib)中是否有类似于
boost::bind的东西?为什么不像
boost::bind
那样,partial编写得更通用(也更有用?

这是Clojure的一个相当常见的问题,更多的是从线程宏->和->>的角度来阐述为什么它们也不允许任意占位符

在我看来,给出的理由也适用于这里:惯用的Clojure函数通常分解为能够单独提供其第一个或最后一个参数的函数,而不是混合提供

换句话说,开发人员通常尝试对函数进行编码,使其符合->、->>和/或部分规则

给定用于匿名函数的reader宏,在需要占位符时创建占位符版本非常容易,适用于不太惯用的情况:

#(f %2 %1) ;; bind(f, _2, _1)
#(g % 9 %) ;; bind(g, _1, 9, _1)

这是Clojure的一个相当常见的问题,更多的是从线程宏->和->>的角度来阐述为什么它们也不允许任意占位符

在我看来,给出的理由也适用于这里:惯用的Clojure函数通常分解为能够单独提供其第一个或最后一个参数的函数,而不是混合提供

换句话说,开发人员通常尝试对函数进行编码,使其符合->、->>和/或部分规则

给定用于匿名函数的reader宏,在需要占位符时创建占位符版本非常容易,适用于不太惯用的情况:

#(f %2 %1) ;; bind(f, _2, _1)
#(g % 9 %) ;; bind(g, _1, 9, _1)

正如肖恩所说,
partial
解决了一个更具体的问题,一般来说,lambda是惯用的解决方案。这就是说,如果你绝望了,你可以随时推出自己的
bind

(defmacro bind
  [bound-function & args]
  (let [; helper function to parse actual argument symbols
        get-symbols (fn [s] (map second s)),
        ; help function to get the placeholder arguments
        get-placeholders (fn [s] (filter first s))
        ; collection of arguments and whether they're placeholders
        bound-args (map (fn [arg]
                        (if (= arg '_)
                          ; for placeholders, generate a new symbol
                          [true (gensym)]
                          ; otherwise, use the provided argument as-is
                          [false arg]))
                      args)]
    `(fn [~@(get-symbols (get-placeholders bound-args))]
       (~bound-function ~@(get-symbols bound-args)))))
其用途如下:

((bind > 9 _) 8) ; true
((bind > _ _) 9 8 ) ; true

正如肖恩所说,
partial
解决了一个更具体的问题,一般来说,lambda是惯用的解决方案。这就是说,如果你绝望了,你可以随时推出自己的
bind

(defmacro bind
  [bound-function & args]
  (let [; helper function to parse actual argument symbols
        get-symbols (fn [s] (map second s)),
        ; help function to get the placeholder arguments
        get-placeholders (fn [s] (filter first s))
        ; collection of arguments and whether they're placeholders
        bound-args (map (fn [arg]
                        (if (= arg '_)
                          ; for placeholders, generate a new symbol
                          [true (gensym)]
                          ; otherwise, use the provided argument as-is
                          [false arg]))
                      args)]
    `(fn [~@(get-symbols (get-placeholders bound-args))]
       (~bound-function ~@(get-symbols bound-args)))))
其用途如下:

((bind > 9 _) 8) ; true
((bind > _ _) 9 8 ) ; true

有一个库允许各种其他参数线程/绑定场景。但是,其中有很多选项,因此优化函数的参数以最好地使用->和->>宏是首选解决方案,如果不可能,请使用匿名函数作为最简单的通用解决方案。

有一个库,允许各种其他参数线程/绑定场景。但是,其中有很多选项,因此优化函数参数以最好地使用->和->>宏是首选解决方案,如果不可能,则使用匿名函数作为最简单的通用解决方案。

根据这种推理,为什么要在语言中包含partial?这只是lambda的一个特例。我个人认为partial更清楚。但是C++03没有lambda。如果你想要占位符,你可以用一个匿名lambda:(def partial plus#(+9%1%2%3))根据这个理由,为什么要在语言中包含partial?这只是lambda的一个特例。我个人认为partial更清楚。但是C++03没有lambda。如果你想要占位符,你可以用匿名lambda:(def partial plus#(+9%1%2%3))将其包装起来。这很有趣,因为我几乎提到了线程宏。您所说的可能是正确的,但一旦您开始调用总是不遵循此规则的java方法,规则就会崩溃。然后,我不得不编写比我希望的更简洁的代码,因为线程宏并不像它可能的那样通用。但是谢谢你的回答。或者更典型的情况是,我想通过5个方法线程化一个arg,4个需要作为第一个arg线程化,第五个需要作为最后一个arg线程化的值。这可能不是惯用的,但我不久前编写了这个宏,发现它很有用。它类似于->或->>,但基于%标记的线程。例如,(->300(/%10)(/60%)将返回2。(defmacro%->([x]x)([x form](if(seq?form)(带meta(postwark replace{x}form)(meta form))(列表form x))([x form&more]`(%->(->~x~form)~@more)))这很有趣,因为我几乎提到了线程宏。您所说的可能是正确的,但一旦您开始调用总是不遵循此规则的java方法,规则就会崩溃。然后,我不得不编写比我希望的更简洁的代码,因为线程宏并不像它可能的那样通用。但是谢谢你的回答。或者更典型的情况是,我想通过5个方法线程化一个arg,4个需要作为第一个arg线程化,第五个需要作为最后一个arg线程化的值。这可能不是惯用的,但我不久前编写了这个宏,发现它很有用。它类似于->或->>,但基于%标记的线程。例如,(->300(/%10)(/60%)将返回2。(defmacro%->([x]x)([x形式](if(seq?form)(带meta(postwark replace{'%x}形式)(meta形式))(列表形式x))([x形式及更多]`(%->(->~x~形式)~@more)))占位符需要编号或参数不能重新排序/忽略等,但我明白了。占位符需要编号或参数不能重新排序/忽略等,但我明白了。