Как определить разницу между типами итераторов nqp

В nqp вы можете создать итератор по хешу nqp или по списку nqp. Я хотел бы иметь возможность выяснить, выполняет ли данный итератор nqp итерацию по хешу или списку. Увы, я не нашел способ сделать это. Кажется, они даже имеют одно и то же имя:

use nqp;
dd nqp::iterator(nqp::hash).^name;  # BOOTIter
dd nqp::iterator(nqp::list).^name;  # BOOTiter

Такой итератор nqp, похоже, знает сам, что это за тип:

use nqp;
nqp::iterkey_s(nqp::iterator(nqp::list));
# This is not a hash iterator, it's a VMIter (BOOTIter)

Предложения приветствуются!

1 ответ

Решение

Я не думаю, что вы можете в данный момент на уровне nqp, кроме как делать то, что вы сделали:

use nqp;
nqp::iterkey_s(nqp::iterator(...));
CATCH {
  when /'not a hash'/ { say 'list?' }
  default             { say 'hash?' }
}

Тем не менее, я не знаю достаточно о NQP и nqp::hash в частности, чтобы выяснить, как получить iterkey_s на самом деле работать.


Основываясь на моих исследованиях, NQP практически не имеет API для nqp::iterator кроме просто использования. И это просто отображает его iterator оп базовой виртуальной машины.


Следующее не является предложением. Я мог бы сказать, что в основном сочувствую вашему положению и призываю всех увидеть простоту и красоту управляемых исключений, но это также сумасшедшая мысль о том, что кто-то погрузится в смелость MoarVM для реализации ужасного взлома, который может сработать на MoarVM, если бы несчастливый.

Предположим, можно написать:

class VMIter is repr('VMIter') { ... }

а затем макет класса, чтобы он соответствовал VMIter структура определена в MoarVM.

Затем, если предположить, что это можно сделать, и класс можно сопоставить с фактической структурой, сгенерированной MoarVM, тогда код P6 может прочитать режим хэш-массива во встроенном MVMIterBody структура.

И если бы это могло быть сделано или даже было задумано, то, возможно, мне нужно подчеркнуть, что люди не должны делать сумасшедшие непереносимые кишки, тыкающие вещи, как я только что описал.

Вместо этого должен быть разумный API, который позволяет nqp iterator s, чтобы различать хэши и массивы так, чтобы их можно было использовать в коде nqp. Я уверен, что это то, что вы хотели. Изучение источников и коммитов nqp и doc позволяет предположить, что в данный момент его там нет.

(И одно закрытие далеко там подумал. Что если однажды там были is repr вариации, которые также могут отображаться на собственные схемы памяти других базовых виртуальных машин, таких как узел или JVM? Это вообще имеет смысл? Когда-нибудь в следующем десятилетии? Может быть?)

Другие вопросы по тегам