Получение типа значения в APL - PullRequest
0 голосов
/ 15 января 2019

У меня есть длинный вектор, который должен быть символьным вектором, но когда я печатаю его, используя функцию DISPLAY Dyalog, получается смешанный вектор. Теперь мне нужно выяснить, какой из элементов не является персонажем. Как получить тип значения в APL?

Ответы [ 3 ]

0 голосов
/ 15 января 2019

Выражение * ⊃0⍴⊂A дает вам тип A. Тип массива, проще говоря, копия массива, но все содержимое рекурсивно заменяется нулями для чисел и пробелами для символов. Это означает, что вы можете сравнить тип с 0, чтобы найти числа.

Возьмем, к примеру, следующий вектор с несколько обманчивой формой отображения по умолчанию: Попробуйте!

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

Форма в штучной упаковке не показывает тип каждого элемента простого вектора; это только означает, что массив имеет смешанный тип с + в нижнем левом углу: Попробуйте!

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

Теперь мы находим тип: Попробуйте!

      ⊢t←⊃0⍴⊂v
    0 0        0

Мы можем сложить его поверх исходного вектора, указав на числа: Попробуйте!

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

Или мы можем сравнить его с нулем, чтобы получить маску для чисел: Попробуйте!

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

Наконец, мы можем получить индексы, где ** есть цифры: Попробуйте!

      ⍸m
4 5 12

* Если вы используете ⎕ML←0, тогда ⊃0⍴⊂ можно записать как одну примитивную функцию
** Если вы используете версию 15.0 или более раннюю, вам придется написать {(,⍵)/,⍳⍴⍵} вместо

0 голосов
/ 16 января 2019

Я на APL2. Наивно я бы пошел на

X≡¨⍕¨X

Числовые значения получают 1, а символьные значения - 0.

Как это

0 голосов
/ 15 января 2019

Используйте ⎕DR ( D ata R epresentation ), чтобы проверить тип вещей. Для char-vec это 82 (на 32-битном интерпретаторе) или 80 (64-битный) - и поскольку 64-битная платформа поддерживает юникод, это может быть и 160 или 320. Вложенный вектор - 326.

NB: Вы также можете использовать ⎕DR¨, чтобы выяснить, какой элемент не соответствует ожидаемому ...

...