Я не думаю, что вы можете в данный момент на уровне 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? Это вообще имеет смысл? Когда-нибудь в следующем десятилетие? Может быть?)