小编Ale*_* C.的帖子

帮我选择合适的Scheme实现

考虑到分散在整个互联网上的有关该主题的系统性过时内容,这似乎真的太多了.

我根本无法找到可用的Scheme实现的无噪声和最新列表(除了那里,但我已经享受了一个丰富的功能总结表)所以我问社区而不是尝试几十种语言的实现我还没掌握.帮助我享受这种神奇的语言.

要求:

  • 免费(如发言)
  • 轻量级:没有超出标准的不必要的库,必须快速编译.比Guile轻的任何东西都可以轻量化.
  • R6RS(请不要使用巨魔,我正在学习语言,觉得有必要坚持标准)
  • 没有.NET,没有JVM
  • 应该至少在Linux上工作
  • 至少应该在x86上工作
  • 容易FFI
  • 快速实施的奖励点(太糟糕了Bigloo不支持R6RS).

我现在正在使用Ypsilon,我发现它很棒,但自2008年以来一直没有维护.Guile可以成为一个很好的竞争者,但它看起来相当沉重(和Ypsilon相比,FFI更容易).

我可能缺少一些高质量的实现,所以请随意分享您的经验.

更新感谢您的回答,我会选择Larceny,因为它提供了我正在寻找的所有内容.祝大家快乐诡计多端!

scheme

9
推荐指数
2
解决办法
1614
查看次数

函数try块,但不在构造函数中

只是一个简单的问题.两者之间有什么区别吗?

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)

如果不是,为什么函数尝试块(构造函数的初始化列表的情况被放在一边)?如果复制构造函数Foox传递给异常时抛出异常会发生什么f

c++ exception-handling

8
推荐指数
2
解决办法
2470
查看次数

标准库分配器指针类型的要求

我正在尝试编写一个四叉树稀疏矩阵类.简而言之,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),是否有任何保证:

  1. 提供静态强制A<T>::pointer转换的能力是一个可访问的基础?A<U>::pointerUT
  2. 静态铸造的能力A<T>::pointer,以A<U>::pointer提供T为的可接近碱U和"运行时类型"(无论这意味着在这种情况下)的castee是U
  3. 类型A<void>::pointer(如果这是有道理的)?

或者我的问题是否有解决方案?

c++ standard-library allocator language-lawyer

8
推荐指数
1
解决办法
390
查看次数

从VBA调用计算密集型例程而不会拖延Excel GUI

我有一组数字密集的例程(每个最多需要1分钟完成)捆绑在一个COM对象中,IDispatch干净地实现.

因此,我可以在Excel工作表中使用它们,这些例程将由按钮触发的VBA宏调用.

现在,当调用其中一个例程时,Excel用户界面被冻结,这对于工作表的最终用户来说非常不舒服.

我想找到任何机制来缓解这个问题.

这可能是例如在COM端启动的另一个线程中启动计算,立即返回,生成的线程在计算结果时回调VBA过程.

或者更简单的东西,因为我一次只需要执行一次计算.

现在,从其他线程调用VBA例程可能存在很多问题.我必须承认,我不熟悉COM,我只把它当作代码和Excel之间的黑盒子(我使用ATL).

所以,

是否可以从另一个线程回调VBA例程?

有没有更好的方法来实现我想要实现的目标?

UPDATE

在权衡选项并在互联网上阅读大量内容后,我将进行合作多线程:在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)

com excel multithreading vba

7
推荐指数
1
解决办法
3350
查看次数

使用灵活的数组成员分配struct

这是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接受它)?

c c99 flexible-array-member

7
推荐指数
1
解决办法
2404
查看次数

c - *(void**)&(int [2]){0,PAGE_SIZE}; 含义?

上下文

阅读一些内核代码.

问题

我无法理解这条线的含义

*(void **) &(int[2]){0,PAGE_SIZE};
Run Code Online (Sandbox Code Playgroud)

更重要的是,这意味着什么

{0,PAGE_SIZE}
Run Code Online (Sandbox Code Playgroud)

对我而言,它看起来不像是逗号的函数.

这段代码可能会发生什么?我不明白这里的间接性.

它是函数还是演员?支架部分是什么意思?似乎对我如此复杂,但绝对有意义.

c pointers

7
推荐指数
1
解决办法
467
查看次数

是什么类型的?b:c`?

让我们说我们有

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),反之亦然,毫不含糊"?

c++

6
推荐指数
1
解决办法
484
查看次数

C++引用vs返回值

我理解引用的原则是避免复制大型结构,但是如果你自己编写的函数创建了一个大型结构呢?是否效率较低(或者你是否更有可能耗尽内存)在本地创建变量,然后返回它,而不是将目标对象作为参考传递,并从函数中填充它?

我似乎不能说得那么好,所以一个具体的例子:假设一个函数接受一个字符串,并返回字符串中每一行的向量.该功能是否有实质性优势:

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)

谢谢你的帮助,怀亚特

c++ performance memory-management

6
推荐指数
2
解决办法
2900
查看次数

Pimpl与类模板构造函数中的智能指针:奇怪的不完整类型问题

当使用带有pImpl惯用语的智能指针时,如

struct Foo
{
private:
    struct Impl; 
    boost::scoped_ptr<Impl> pImpl;
};
Run Code Online (Sandbox Code Playgroud)

显而易见的问题是Foo::ImplFoo生成析构函数时不完整.

编译器通常在那里发出警告,并且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)

c++ pimpl-idiom smart-pointers incomplete-type

5
推荐指数
1
解决办法
3305
查看次数

在C++中使用部分专业化11

我有以下代码:

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)

c++ templates c++11

5
推荐指数
1
解决办法
3394
查看次数