我正在用 C++ 编写代码,但我真的很喜欢 K/APL 的面向数组的风格。
有谁知道一组很好的运算符重载技巧/宏/...以允许在 C++ 中进行一些 K/APL 风格的编程?
谢谢!
对于数学,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
我没有专门研究过 K/APL,但根据您的观点,您可能会争辩说由提供的某些运算符重载std::valarray
与 APL 模糊相似。通过它对通用字符名称的支持,您甚至可以(至少在理论上)为其中一些提供类似 APL 的名称。
这仍然留下了一些根本不像 APL 的特性,例如 C++ 中的运算符具有优先级和关联性,而 APL 运算符根本没有(至少在记忆服务的情况下)。