首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何区分nqp迭代器的类型

如何区分nqp迭代器的类型
EN

Stack Overflow用户
提问于 2019-03-18 15:07:34
回答 1查看 84关注 0票数 4

在nqp中,可以在nqp散列或nqp列表上创建迭代器。我希望能够找出给定的nqp迭代器是否正在对散列或列表进行迭代。唉,我没有办法做到这一点。他们甚至似乎有着相同的名字:

代码语言:javascript
复制
use nqp;
dd nqp::iterator(nqp::hash).^name;  # BOOTIter
dd nqp::iterator(nqp::list).^name;  # BOOTiter

这样的nqp迭代器似乎知道它是什么类型:

代码语言:javascript
复制
use nqp;
nqp::iterkey_s(nqp::iterator(nqp::list));
# This is not a hash iterator, it's a VMIter (BOOTIter)

欢迎提出建议!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-18 17:20:45

我不认为你现在可以在nqp级别上,除非你做了你已经做过的事:

代码语言:javascript
复制
use nqp;
nqp::iterkey_s(nqp::iterator(...));
CATCH {
  when /'not a hash'/ { say 'list?' }
  default             { say 'hash?' }
}

尽管如此,我对nqp和nqp::hash还不太了解,特别是不知道如何让iterkey_s实际工作。

根据我的调查,除了使用NQP之外,NQP基本上没有用于nqp::iterator的API。它只是操作到底层VM。

下面是而不是的建议。我可以说,这主要是为了同情你的困境,鼓励每个人看到管理异常的简单性和美妙之处,但这也是一个疯狂的想法,有人潜入MoarVM的内脏实施可怕的黑客攻击,如果他们是(不)幸运的话,可能在MoarVM上工作。

假设一个人可以写:

代码语言:javascript
复制
class VMIter is repr('VMIter') { ... }

然后对类进行布局,使其对应于在MoarVM中定义的结构

然后,假设可以这样做,并且类可以映射到MoarVM生成的实际结构,那么P6代码可以在嵌入式MVMIterBody结构中读取散列模式与数组模式

如果这是可以做到的,甚至是被考虑到的,那么也许我需要强调的是,人们不应该像我刚才描述的那样做疯狂的、不可携带的戳人的事情。

相反,应该有一个合理的API,允许nqp iterator以一种可以在nqp代码中使用的方式区分散列和数组。我相信这就是你想要的。查看nqp源代码并提交,doc建议目前还不存在。

(还有一个人走到很远的地方想。如果有一天有is repr变体也可以映射到其他底层JVM (如节点或JVM)的本地内存布局,该怎么办?这说得通吗?在下一个十年的某个时候?也许吧?)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55224407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档