raku - 如何区分 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)
欢迎提出建议!
解决方案
我不认为你现在可以在 nqp 级别,除非按照你所做的那样做:
use nqp;
nqp::iterkey_s(nqp::iterator(...));
CATCH {
when /'not a hash'/ { say 'list?' }
default { say 'hash?' }
}
也就是说,我对 nqp 知之甚少,nqp::hash
尤其是不知道如何开始iterkey_s
实际工作。
根据我的调查,NQPnqp::iterator
除了使用它之外基本上没有 API。它只是将其 op 映射iterator
到底层 VM。
以下不是建议。我可以说这主要是为了同情你的困境并鼓励每个人看到托管异常的纯粹简单和美丽,但如果有人潜入 MoarVM 的胆量来实施一个可能适用于 MoarVM 的可怕黑客,这也是一个疯狂的想法(不)幸运。
假设可以写:
class VMIter is repr('VMIter') { ... }
然后对类进行布局,使其与MoarVM 中定义的VMIter
结构相对应。
然后,假设可以做到,并且类可以映射到 MoarVM 生成的实际结构,那么 P6 代码可以读取嵌入式结构中的哈希与数组模式。MVMIterBody
如果可以做到,或者甚至考虑过,那么也许我需要强调人们不应该像我刚才描述的那样做疯狂的非便携式胆量戳东西。
相反,应该有一个合理的 API 允许 nqpiterator
以可以在 nqp 代码中使用的方式区分散列和数组。我确定这就是你想要的。探索 nqp 来源和提交和文档表明它目前不存在。
(还有一个很遥远的想法。如果有一天有一些is repr
变化也可以映射到其他底层虚拟机(如 node 或 JVM)的本机内存布局呢?这是否有意义?在未来十年的某个时候?也许?)
推荐阅读
- express - index.html 文件未加载到我的快速服务器上
- asp.net-core - 如何使用 localhost 以外的 URL 调试 ASP.NET Core webapp
- c# - 如何抓取 Sycnfusion ScheduleView 的 VisibleDate
- python - 如何制作具有两个变量的条件函数的等高线图?
- javascript - “从一年开始的世纪”中的错误
- java - 当 HTTP 请求采样器失败时运行的 JMeter Beanshell 采样器
- java - Java中具有多个条件字段的动态排序
- c++ - 访问 lambda 之外的捕获变量
- go - 遵循“配置多个调度程序”Kubernetes 指南时发生错误
- sql-server - 多维数据集中的两个维度不相互连接