获取 APL 中值的类型

Getting the type of a value in APL

我有一个长向量,它应该是一个字符向量,但是当我使用 Dyalog 的 DISPLAY 函数打印它时,它变成了一个混合向量。现在我需要找出哪些元素不是字符。如何在 APL 中检索值的类型?

使用⎕DR (Data Representation) 来检查事物的类型。对于 char-vec,它是 82(在 32 位解释器上)或 80(64 位)——并且由于 64 位平台支持 unicode,它也可以是 160 或 320。嵌套向量为 326.

注意:你也可以使用⎕DR¨来调查哪个元素不符合你的预期...

表达式* ⊃0⍴⊂A 给出了 A 的类型。简单地说,数组的类型是数组的副本,但所有内容递归地替换为数字零和字符空格。这意味着您可以将类型与 0 进行比较以查找数字。

以下面的矢量为例,默认显示形式有点欺骗性:Try it!

      ⊢v←'abc',1 2,'de 3 4',5
abc 1 2 de 3 4 5

盒装显示形式不会告诉您简单向量的每个元素的类型;它仅表示数组在左下角具有混合类型 +Try it!

      ]display v
┌→───────────────┐
│abc 1 2 de 3 4 5│
└+───────────────┘

现在我们找到类型:Try it!

      ⊢t←⊃0⍴⊂v
    0 0        0

我们可以将它堆叠在原始向量之上以指向数字:Try it!

      ↑t v
    0 0        0
abc 1 2 de 3 4 5

或者我们可以将它与零进行比较以获得数字的掩码:Try it!

      ⊢m←0=t
0 0 0 1 1 0 0 0 0 0 0 1

最后,我们可以得到索引,其中**有数字:Try it!

      ⍸m
4 5 12

* 如果你使用的是⎕ML←0,那么⊃0⍴⊂可以写成单一原始函数
** 如果您使用的是 15.0 或更早版本,则必须编写 {(,⍵)/,⍳⍴⍵} 而不是

我在 APL2。 天真地我会选择

X≡¨⍕¨X

数字值为 1,字符值为 0。

Like this