9

我正在用 C++ 编写代码,但我真的很喜欢 K/APL 的面向数组的风格。

有谁知道一组很好的运算符重载技巧/宏/...以允许在 C++ 中进行一些 K/APL 风格的编程?

谢谢!

4

2 回答 2

6

对于数学,Blitz++是最大的数组编程库。以下是文档中的一些示例:

#include <blitz/array.h>

using namespace blitz;

Array<int, 1> x(10);     // one-dimensional array of 10 int's
firstIndex i;            // place holder index
x = 10 * i;              // x == 0, 10, 20, 30...
x = 10 * tensor::i;      // a short form of the above two expressions

// another example, with array-level assignments and arithmetic
Array<int, 1> a(4), b(4), c(4);
a = 1, 2, 3, 4;
b = 5, 6, 7, 8;
c = a + b;

Blitz++ 使用表达式模板,这是一种类似于惰性求值的模板元编程技术。所以编译器生成的代码不使用任何不必要的临时变量,并且应该和手写循环一样快。

下面是等效的 k 代码,感兴趣的可以参考:

  x:10*!10
  x
0 10 20 30 40 50 60 70 80 90

  a:1 2 3 4
  b:5 6 7 8
  c:a+b
  c
6 8 10 12
于 2010-11-10T23:12:41.067 回答
2

我没有专门研究过 K/APL,但根据您的观点,您可能会争辩说由提供的某些运算符重载std::valarray与 APL 模糊相似。通过它对通用字符名称的支持,您甚至可以(至少在理论上)为其中一些提供类似 APL 的名称。

这仍然留下了一些根本不像 APL 的特性,例如 C++ 中的运算符具有优先级和关联性,而 APL 运算符根本没有(至少在记忆服务的情况下)。

于 2010-04-20T22:34:59.317 回答