gpt4 book ai didi

c++ - 使用参数包的 lisp-like c++

转载 作者:太空狗 更新时间:2023-10-29 21:17:46 28 4
gpt4 key购买 nike

我对 this 很感兴趣问题,所以我不得不尝试一下,因为它让我想起了我非常喜欢的 lisp。该问题的示例:

auto list = [](auto ...xs) { 
return [=](auto access) { return access(xs...); };
};

auto length = [](auto xs) {
return xs([](auto ...z) { return sizeof...(z); });
};

int main()
{
std::cout << length(list(1, '2', "3")); // 3
}

最终我得到了更多的多态 lambda,这进一步使它看起来像 lisp:

auto l = list(-1, 2, 3, 4, 5, 6);
cons(unary::map(unary::inc)
(binary::map(binary::add)
(cdr(l), 1)), list(12, 13, 14, 15, 16)))
// just an example, it doesn't really look that much like lisp, but still I was amused

现在,如果我想要一个打印函数,我必须这样写:

auto print = [](auto i)
{
std::cout << i << " ";
return i;
};

然后将其映射到参数包中的每个参数。

这不是真正的 lisp,我想知道是否有一种方法可以使用 lisp 中使用的 car/cdr 样式递归遍历参数包。显然,必须使用 list lambda 返回的闭包。

另外,我知道参数包不应该真正用于此类事情。

编辑:

我设法使用模板实现了递归打印:

template<typename First>
void print_helper(First f)
{
std::cout << f << std::endl;
}

template<typename First, typename... Rest>
void print_helper(First f, Rest... r)
{
std::cout << f << " ";
print_helper(r...);
}

template<typename Lambda>
void print(Lambda l)
{
l([=](auto... elements)
{
print_helper(elements...);
});
}

但是现在我遇到了返回值的递归函数的问题。假设我想要一个 filter/remove-if 函数,它返回满足所提供谓词给定要求的元素列表。目前我正在为每个元素使用一个 std::pair (就像在链接的问题中一样),如果在打印时应该跳过这对,它包含一个标志。有没有办法在不需要标志的情况下实际返回那些元素的列表?

最佳答案

我不太确定这是否是您想要的,但也许它有帮助:

Live here

template<bool = true>
struct printer {
template<typename List>
static void run (List xs) {
return xs([](
auto first /* the car */,
auto... rest /* the cdr, more or less */) {
cout << first << " ";
printer<(sizeof...(rest) > 0)>::run(
list(rest...)); // building a new list every time, tough
});
}
};
template<>
struct printer<false> {
template<typename List>
static void run (List xs) {}
};
auto print = [](auto xs) {
return xs([=](auto ...z) {
printer<(sizeof...(z) > 0)>::run(xs);
});
};

尽管这仅适用于编译时已知的列表,因为终止是通过模板参数完成的。


根据您引用的问题,在顶部答案的末尾有一个链接: https://gist.github.com/Manu343726/fb57746274fffc043c2a

foldl_ 值得一看,它似乎完成了我必须使用辅助结构的任务。


可变值为 working , 但列表的长度及其元素类型必须在编译时已知。

关于c++ - 使用参数包的 lisp-like c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31638877/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com