K/APL стиль программирования в C++?
Я пишу код на C++, но мне действительно нравится стиль массива, ориентированный на K/APL.
Кто-нибудь знает хороший набор трюков перегрузки операторов / макросов / ..., позволяющих программирование в стиле K/APL на C++?
Спасибо!
2 ответа
Для математики 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 (по крайней мере, если память служит).