Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

K/APL style programming in C++?

Tags:

c++

apl

k

I'm writing code in C++, but I really like K/APL's array-oriented style.

Does anyone know of a good set of operator overloading tricks / macros / ... to allow some K/APL -style programming in C++?

Thanks!

like image 281
anon Avatar asked Apr 20 '10 22:04

anon


2 Answers

For mathematics, Blitz++ is the biggest library for array programming. Here are some examples from the documentation:

#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++ uses expression templates, a template metaprogramming technique similar to lazy evaluation. So the compiler-generated code doesn't use any unnecessary temporary variables, and should be as fast as hand-written loops.

Here's the equivalent k code, for the interested:

  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
like image 57
chrisaycock Avatar answered Nov 19 '22 02:11

chrisaycock


I haven't looked specifically at K/APL, but depending on your viewpoint, you could argue that some of the operator overloads provided by std::valarray are vaguely similar to APL. With its support for Universal Character names, you could (at least in theory) even provide APL-like names for some of them.

That still leaves some characteristics that aren't like APL at all, such as operators in C++ having precedence and associativity, which APL operators don't at all (at least if memory serves).

like image 42
Jerry Coffin Avatar answered Nov 19 '22 01:11

Jerry Coffin