考虑到分散在整个互联网上的有关该主题的系统性过时内容,这似乎真的太多了.
我根本无法找到可用的Scheme实现的无噪声和最新列表(除了那里,但我已经享受了一个丰富的功能总结表)所以我问社区而不是尝试几十种语言的实现我还没掌握.帮助我享受这种神奇的语言.
要求:
我现在正在使用Ypsilon,我发现它很棒,但自2008年以来一直没有维护.Guile可以成为一个很好的竞争者,但它看起来相当沉重(和Ypsilon相比,FFI更容易).
我可能缺少一些高质量的实现,所以请随意分享您的经验.
更新感谢您的回答,我会选择Larceny,因为它提供了我正在寻找的所有内容.祝大家快乐诡计多端!
只是一个简单的问题.两者之间有什么区别吗?
void f(Foo x) try
{
...
}
catch(exception& e)
{
...
}
Run Code Online (Sandbox Code Playgroud)
和
void f(Foo x)
{
try { ... }
catch (exception& e)
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
?
如果不是,为什么函数尝试块(构造函数的初始化列表的情况被放在一边)?如果复制构造函数Foo在x传递给异常时抛出异常会发生什么f?
我正在尝试编写一个四叉树稀疏矩阵类.简而言之,quadtree_matrix<T>或者是零矩阵或者四元(ne, nw, se, sw)的quadtree_matrix<T>.
我想最终测试不同的分配方案,因为这可能会影响线性代数运算的性能.所以我还将模板化quadtree_matrix标准分配器类型,以便我可以重用现有的分配器.
我将不得不分配两种不同类型的数据:a T或a node,包含四个指针(T或节点).对于我将考虑的所有算法,我知道可以期待什么样的数据,因为我知道在算法的任何一点上我面临的子矩阵的大小(我甚至不需要存储这些大小).
我当然会使用两个不同的分配器:这是可以的,因为分配器类型提供rebind模板和模板复制构造函数(并且旨在用作值类型,因为get_allocator标准容器的成员通过返回副本来建议).
问题是分配器成员函数使用某种pointer类型,这不需要是一个vanilla指针.一些分配器(boost进程间分配器)广泛使用此功能.
如果分配器指针类型是花园种类指针,我将没有问题:至少,我可以使用指针void并将它们重新解释为正确的类型(node*或者T*).我也可以使用联盟(可能更好).
据我所知,对allocator::pointer类型的POD没有要求.它们只需要是随机访问迭代器.
现在,我的问题是:
给定一个allocator类模板A<T>(或其等价物A::rebind<T>::other),是否有任何保证:
A<T>::pointer转换的能力是一个可访问的基础?A<U>::pointerUTA<T>::pointer,以A<U>::pointer提供T为的可接近碱U和"运行时类型"(无论这意味着在这种情况下)的castee是U?A<void>::pointer(如果这是有道理的)?或者我的问题是否有解决方案?
我有一组数字密集的例程(每个最多需要1分钟完成)捆绑在一个COM对象中,IDispatch干净地实现.
因此,我可以在Excel工作表中使用它们,这些例程将由按钮触发的VBA宏调用.
现在,当调用其中一个例程时,Excel用户界面被冻结,这对于工作表的最终用户来说非常不舒服.
我想找到任何机制来缓解这个问题.
这可能是例如在COM端启动的另一个线程中启动计算,立即返回,生成的线程在计算结果时回调VBA过程.
或者更简单的东西,因为我一次只需要执行一次计算.
现在,从其他线程调用VBA例程可能存在很多问题.我必须承认,我不熟悉COM,我只把它当作代码和Excel之间的黑盒子(我使用ATL).
所以,
是否可以从另一个线程回调VBA例程?
有没有更好的方法来实现我想要实现的目标?
在权衡选项并在互联网上阅读大量内容后,我将进行合作多线程:在COM对象中,我将有三个:
class CMyObject : ...
{
...
STDMETHOD(ComputationLaunch)(...); // Spawn a thread and return immediately
STDMETHOD(ComputationQuery)(DOUBLE* progress, BOOL* finished);
STDMETHOD(ComputationResult)(VARIANT* out);
private:
bool finished, progress;
boost::mutex finished_lock, progress_lock;
ResultObject result; // This will be marshaled to out
// when calling ComputationResult
};
Run Code Online (Sandbox Code Playgroud)
在VBA中:
Private computeActive as Boolean ' Poor man's lock
Public Sub Compute()
OnError GoTo ErrHandler:
If computeActive Then Exit Sub
computeActive = True
Dim o …Run Code Online (Sandbox Code Playgroud) 这是C99代码:
typedef struct expr_t
{
int n_children;
foo data; // Maybe whatever type with unknown alignment
struct expr_t *children[];
} expr_t;
Run Code Online (Sandbox Code Playgroud)
现在,我该如何分配内存?
expr_t *e = malloc (sizeof (expr_t) + n * sizeof (expr_t *));
Run Code Online (Sandbox Code Playgroud)
要么
expr_t *e = malloc (offsetof (expr_t, children) + n * sizeof (expr_t *));
Run Code Online (Sandbox Code Playgroud)
?
被sizeof甚至保证与柔性阵列构件的工作类型(GCC接受它)?
阅读一些内核代码.
我无法理解这条线的含义
*(void **) &(int[2]){0,PAGE_SIZE};
Run Code Online (Sandbox Code Playgroud)
更重要的是,这意味着什么
{0,PAGE_SIZE}
Run Code Online (Sandbox Code Playgroud)
对我而言,它看起来不像是逗号的函数.
这段代码可能会发生什么?我不明白这里的间接性.
它是函数还是演员?支架部分是什么意思?似乎对我如此复杂,但绝对有意义.
让我们说我们有
template <typename T>
struct Foo
{};
Run Code Online (Sandbox Code Playgroud)
和
struct Bar
{
template <typename T>
operator Foo<T>() const { return Foo<T>(); }
};
Run Code Online (Sandbox Code Playgroud)
和
template <typename T>
Foo<T> Baz(T const&) { return Foo<T>(); }
Run Code Online (Sandbox Code Playgroud)
然后,因为可以转换为true ? Bar() : Baz(some_expr_of_type_double)类型.此技巧用于查询类型而不进行评估.Foo<double>BarFoo<double>some_expr_of_type_double
确定类型的规则是a ? b : c什么?我很欣赏标准的相关部分(我没有副本).有没有" typeof(b)必须可以转换为typeof(c),反之亦然,毫不含糊"?
我理解引用的原则是避免复制大型结构,但是如果你自己编写的函数创建了一个大型结构呢?是否效率较低(或者你是否更有可能耗尽内存)在本地创建变量,然后返回它,而不是将目标对象作为参考传递,并从函数中填充它?
我似乎不能说得那么好,所以一个具体的例子:假设一个函数接受一个字符串,并返回字符串中每一行的向量.该功能是否有实质性优势:
void getLines(std::string in, std::vector<std::string>& out);
Run Code Online (Sandbox Code Playgroud)
过度:
std::vector<std::string> getLines(std::string in);
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助,怀亚特
当使用带有pImpl惯用语的智能指针时,如
struct Foo
{
private:
struct Impl;
boost::scoped_ptr<Impl> pImpl;
};
Run Code Online (Sandbox Code Playgroud)
显而易见的问题是Foo::Impl在Foo生成析构函数时不完整.
编译器通常在那里发出警告,并且boost::checked_delete由Boost智能指针在内部使用,静态断言该类Foo::Impl是完整的,如果不是这样则触发错误.
对于上面的编译示例,因此必须编写
struct Foo
{
~Foo();
private:
struct Impl;
boost::scoped_ptr<Impl> pImpl;
};
Run Code Online (Sandbox Code Playgroud)
并Foo::~Foo在实现文件中实现一个空,Foo::Impl完成的地方.这是智能指针优于裸指针的优势,因为我们不能无法实现析构函数.
到现在为止还挺好.但是当我尝试在类似的Bar类中引入模板构造函数时,我遇到了一种奇怪的行为(完整代码,请亲自尝试):
// File Bar.h
#ifndef BAR_H
#define BAR_H 1
#include <vector>
#include <boost/scoped_ptr.hpp>
struct Bar
{
template <typename I>
Bar(I begin, I end);
~Bar();
private:
struct Impl;
boost::scoped_ptr<Impl> pImpl;
void buildImpl(std::vector<double>&);
};
template <typename I>
Bar::Bar(I begin, I end)
{
std::vector<double> tmp(begin, …Run Code Online (Sandbox Code Playgroud) 我有以下代码:
template<class T, int I=44> struct test {T j = I;};
template<int J> struct test<int, J> {int j = J;};
int main()
{
test<55> jj;
std::cout << jj.j << std::endl;
return(1);
}
Run Code Online (Sandbox Code Playgroud)
编译器(clang)只抱怨该行 test<55> jj
我不明白为什么?有工作吗?
如果它抱怨该行,为什么不抱怨第二个模板定义?
提前致谢.
消息是:
enable.cpp:17:8: error: template argument for template type parameter must be a type
test<55> jj;
^~
enable.cpp:9:16: note: template parameter is declared here
template<class T, int I=44> struct test
Run Code Online (Sandbox Code Playgroud)