私は 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とはまったく異なるいくつかの特性が残ります(少なくともメモリが機能する場合)。