在这点上,在/sf/ask/328763291/?answertab=votes#tab-top中,Kevin Cantu发表评论说:
是的,仅仅超越语法,JavaScript可能更像是一个Lisp而不是Haskell.(最初被认为是计划实施......)
此外,在Lambda终极版:100行中的JavaScript编译器中,他们说:
很明显JS和Lisp在语义层面有很强的联系[...]
我熟悉Lisp和函数式编程,但不熟悉JavaScript.所以这些命题让人想知道JavaScript有多强大.到目前为止我所读到的是它提供了lambda表达式和闭包.还提供了哪些功能性编程概念和类似Lisp的功能?例如,它是否提供尾调用递归或宏,或者将代码作为数据操作的能力(如Lisp)?
我正在设计一个C++库,它从一些实验中读取报告数据的CSV文件,并进行一些聚合并输出一个pgfplots代码.我想使库尽可能通用且易于使用.我还希望将其与CSV文件中表示的数据类型隔离开来,并将选项留给用户按照自己的意愿解析每个列.我也想避免使用Boost Spirit Qi或其他重型解析器.
我所拥有的简单解决方案是让用户为每个列创建一个类型,其构造函数采用"char*".构造函数自己解析它给出的值,它是数据中的一个单元格.然后用户传给我一个类型列表; 模式,表示一行数据中的类型.我使用这个类型列表来创建一个元组,其中元组的每个成员都负责解析自身.
现在的问题是如何初始化(构造)这个元组.处理元组当然不是直截了当的,因为迭代它们的元素主要是编译时操作.我最初使用Boost Fusion来完成这项任务.但是,我使用的函数(转换)虽然可能将元组作为输入(使用适当的适配器),但它似乎不返回元组.我需要将返回值作为元组,因此其他一些代码可以将它用作关联的类型到值的容器(通过类型via访问它std::get<T>),而只使用标准工具,即不使用Boost.所以我不得不将返回的任何Fusion转换为std :: tuple.
我的问题是如何避免这种转换,更好的是如何完全避免Boost Fusion.
想到一个简单的解决方案是使用std :: tuple的构造函数,并以某种方式将每个元素传递给它需要构造的相应"const*".然而,尽管使用一些复杂的基于模板的枚举技术是可能的,但我想知道是否有一种简单的"参数包"式方法,或者更简单的方法将值传递给单个元素的构造函数.元组.
为了澄清我在寻找什么,请看下面这段代码.
#include <cstdio>
#include <array>
template <typename...> struct format {};
template <typename...> struct file_loader {};
template <typename... Format>
struct
file_loader<format<Format...> > {
void load_file() {
size_t strsize = 500u;
char *str = new char[strsize]();
auto is = fopen("RESULT","r");
/* example of RESULT:
dataset2,0.1004,524288
dataset1,0.3253,4194304
*/
while(getline(&str, &strsize, is) >= 0) {
std::array<char*, 3> toks{};
auto s = str;
int i = 2;
while(i --> …Run Code Online (Sandbox Code Playgroud) 我有以下C++片段
double exetime = 0;
SVDRec R;
{
timer<double> dummy{exetime};
R = svdLAS2();
}
std::cout << exetime << std::endl;
Run Code Online (Sandbox Code Playgroud)
timer记录的构造函数,输入作用域的时间,以及它的析构函数(在块离开时调用)计算传递的时间并将其存储exetime.R仅在块内初始化,并且它没有默认构造函数,因此代码不会因此而编译.但我不想初始化R为一些虚拟值.
这也是不编译的:
double exetime = 0;
SVDRec &&tmpR;
{
timer<double> dummy{exetime};
tmpR = svdLAS2();
}
SVDRec R = tmpR;
std::cout << exetime << std::endl;
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用指针,但我不想使用动态分配,也不想使用std :: unique_ptr.反正有没有实现这个目标?