用C ++编写K / APL样式?

时间:2010-04-20 22:27:27

标签: c++ apl k

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

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

谢谢!

2 个答案:

答案 0 :(得分:5)

对于数学,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 ++使用expression templates,一种类似于懒惰评估的模板元编程技术。因此编译器生成的代码不使用任何不必要的临时变量,并且应该与手写循环一样快。

这是感兴趣的等效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

答案 1 :(得分:2)

我没有特别关注K / APL,但根据您的观点,您可能会认为std::valarray提供的某些运算符重载与APL模糊地相似。由于它支持通用角色名称,您(至少在理论上)甚至可以为其中一些提供类似APL的名称。

这仍然留下一些与APL完全不同的特征,例如C ++中具有优先级和关联性的运算符,APL运算符根本不具备这些特性(至少在内存服务的情况下)。