Как определить разницу между типами итераторов nqp - PullRequest
4 голосов
/ 18 марта 2019

В 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 Ответ

4 голосов
/ 18 марта 2019

Я не думаю, что вы можете в данный момент на уровне 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 позволяет предположить, что в данный момент его там нет.

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

...