使用参数包的类似lisp的c++
lisp-like c++ using parameter packs
我对这个问题很感兴趣,所以我必须尝试一下,因为它让我想起了我绝对喜欢的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
}
最终我得到了一些更多的多态lambdas,这进一步使它看起来像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(就像在链接的问题中一样),如果在打印时应该跳过对,则包含一个标志。有没有一种方法可以在不需要标记的情况下实际返回这些元素的列表?
我不太确定这是否是你想要的,但也许它有帮助:
住在这里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_
值得一看,它似乎完成了我必须使用帮助结构体的任务。
可以使用可变值,但必须在编译时知道列表的长度及其元素类型。
相关文章:
- 为什么 Lisp 中 1000 阶乘的计算如此之快(并显示正确的结果)?
- 如何在C++中将一个简单的类似 Lisp 的代码拆分为标记?
- RPC从C++代码到公共Lisp代码
- 编译包装器时出现SWIG [C++ to Lisp(CFFI)]错误
- 我可以用C包装OpenCV的C++接口,然后用Lisp的CFFI包装吗?
- 每个大型项目都包含一个Lisp解释器吗
- 从LISP的套接字中读取c++结构
- Visual Lisp:如何调用外部c++ DLL中的函数
- Lua vs嵌入式Lisp和潜在的其他候选.用于基于集合的数据处理
- 如何将这个lisp函数转换为可编译代码
- 是否有一种方法将我的GCL Lisp文件与Windows上的单独c++程序链接
- 使用参数包的类似lisp的c++
- 如何在emacs-lisp中获取c/c++头系统include目录
- 如何在0(1)运算中将c++向量转换为lisp向量
- 用堆栈而不是递归实现Lisp-eval
- C++程序中的Lisp解释器
- Lisp and Android NDK
- 将 Lisp 转换为 C++
- 在c++中并行实现lisp风格的函数到列表的映射,在使用线程后没有cout就会失败