【问题标题】:K/APL style programming in C++?C++ 中的 K/APL 风格编程?
【发布时间】:2010-11-11 11:31:39
【问题描述】:

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

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

谢谢!

【问题讨论】:

  • 这只是我的拙见,但如果你打算用 C++ 编程,你应该用 C++ 风格编程。
  • 我不知道 APL。您能否制作一个您所谓的面向数组的样式的“代表性”示例?你的意思是像 Matlab 一样面向数组是面向矩阵的吗?
  • 我看了一下 K 编程语言。按长度对字符串列表进行排序:x@>#:'x。吓人
  • @Ugo 查看我答案末尾的示例,以获取数组编程的示例。基本上,运算发生在向量而不是标量上。您引用的 k 示例在“简洁”语言中经过足够的练习后非常有意义。

标签: c++ apl k


【解决方案1】:

对于数学,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

【讨论】:

    【解决方案2】:

    我没有专门研究过 K/APL,但根据您的观点,您可能会争辩说 std::valarray 提供的某些运算符重载与 APL 有点相似。由于它对通用字符名称的支持,您甚至可以(至少在理论上)为其中的一些提供类似 APL 的名称。

    这仍然留下了一些根本不像 APL 的特性,例如 C++ 中的运算符具有优先级和关联性,而 APL 运算符则根本没有(至少如果有记忆的话)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      • 2010-12-02
      • 2012-02-15
      • 2015-05-27
      • 2016-04-25
      相关资源
      最近更新 更多