如何在C++中实现'reverse application function'?
How to implement 'reverse application function' in C++?
我正在编写以 OCaml 作为主要语言的项目的 C++ 部分。我对 OCaml 比 C++ 更有经验。
当此名称是逻辑的概念点(以突出显示)或当此名称被多个函数期望作为参数时(可能,我在其他情况下也可以使用它,但它对当前上下文并不重要)。以下 4 个变量对我来说不仅仅是多余的。对于我来说,它们会产生信息噪音并降低代码可读性。
auto caml_level = Caml::Value::of_int(level);
auto caml_api_state = Core::Api::File::open_new(caml_level);
auto polimorpic_variant_hash_status =
_api -> extract_and_save_state(caml_api_state);
auto status = statuses.at(polimorpic_variant_hash_status);
这就是为什么我编写了计算 status
而不使用任何其他变量的代码。
auto status =
statuses.at(
_api -> extract_and_save_state(
Core::Api::File::open_new(
Caml::Value::of_int(
level
)
)
)
);
对于我来说,第二个示例看起来更好但仍然不能令人满意,因为需要从下到上阅读这段代码。我可以颠倒函数的顺序以提供从上到下阅读的能力吗?是否可以像第三个示例那样编写它,我们假设 C++ 具有 OCaml |>
运算符?
auto status =
level |> Caml::Value::of_int
|> Core::Api::File::open_new
|> _api -> extract_and_save_state
|> statuses.at
如何在C++中实现反向应用功能?
(这些例子来自于我试图在 OCaml 和 C++ 之间实现一个具有良好可读性的桥梁。这个桥梁包含很多转换,比如从 C int 到 OCaml int,反之亦然,因此,它可能有很多变量。而且这些变量是底层操作的结果,不是概念点。所以,给它们取个好名字并不容易。
C++ 不允许您定义新的中缀运算符,因此您将不得不使用标识符。
假设您很高兴使用 | rap >
(空格可选)而不是 |>
。
struct rap_t {
template <typename F>
struct wrapper_t { F f; };
template <typename F>
friend wrapper_t<F> operator>(rap_t, F&& f) { return { std::forward<F>(f) }; }
template <typename T, typename F>
friend std::invoke_result_t<F, T> operator|(T&& t, wrapper_t<F> w)
{ return std::invoke(std::forward<F>(w.f), std::forward<T>(t)); }
} rap;
这让你可以
auto reuslt =
level |rap> &Caml::Value::of_int
|rap> &Core::Api::File::open_new
|rap> std::bind_front(&Api::extract_and_save_state, _api)
|rap> &results.at
我正在编写以 OCaml 作为主要语言的项目的 C++ 部分。我对 OCaml 比 C++ 更有经验。
当此名称是逻辑的概念点(以突出显示)或当此名称被多个函数期望作为参数时(可能,我在其他情况下也可以使用它,但它对当前上下文并不重要)。以下 4 个变量对我来说不仅仅是多余的。对于我来说,它们会产生信息噪音并降低代码可读性。
auto caml_level = Caml::Value::of_int(level);
auto caml_api_state = Core::Api::File::open_new(caml_level);
auto polimorpic_variant_hash_status =
_api -> extract_and_save_state(caml_api_state);
auto status = statuses.at(polimorpic_variant_hash_status);
这就是为什么我编写了计算 status
而不使用任何其他变量的代码。
auto status =
statuses.at(
_api -> extract_and_save_state(
Core::Api::File::open_new(
Caml::Value::of_int(
level
)
)
)
);
对于我来说,第二个示例看起来更好但仍然不能令人满意,因为需要从下到上阅读这段代码。我可以颠倒函数的顺序以提供从上到下阅读的能力吗?是否可以像第三个示例那样编写它,我们假设 C++ 具有 OCaml |>
运算符?
auto status =
level |> Caml::Value::of_int
|> Core::Api::File::open_new
|> _api -> extract_and_save_state
|> statuses.at
如何在C++中实现反向应用功能?
(这些例子来自于我试图在 OCaml 和 C++ 之间实现一个具有良好可读性的桥梁。这个桥梁包含很多转换,比如从 C int 到 OCaml int,反之亦然,因此,它可能有很多变量。而且这些变量是底层操作的结果,不是概念点。所以,给它们取个好名字并不容易。
C++ 不允许您定义新的中缀运算符,因此您将不得不使用标识符。
假设您很高兴使用 | rap >
(空格可选)而不是 |>
。
struct rap_t {
template <typename F>
struct wrapper_t { F f; };
template <typename F>
friend wrapper_t<F> operator>(rap_t, F&& f) { return { std::forward<F>(f) }; }
template <typename T, typename F>
friend std::invoke_result_t<F, T> operator|(T&& t, wrapper_t<F> w)
{ return std::invoke(std::forward<F>(w.f), std::forward<T>(t)); }
} rap;
这让你可以
auto reuslt =
level |rap> &Caml::Value::of_int
|rap> &Core::Api::File::open_new
|rap> std::bind_front(&Api::extract_and_save_state, _api)
|rap> &results.at