问题标签 [rakudo]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
windows - 在 Windows 中构建 Rakudo 时的警告
Rakudo
我按照此处的说明进行了构建。通过类似的阅读here和here,我尝试使用VS-2019在Windows中构建它。
但是,Rakudo
在 Windows 中构建时,我收到以下构建警告:
上面的代码块中只显示了警告。完整的日志在这里给出。
用于构建的系统:Appveyor with VS-2019 in Windows
配置:
- 虽然我已经从 Chocolatey 安装
zstandard
(https://github.com/facebook/zstd),但为什么我会得到.. did not find libzstd; will not use heap snapshot format version 3
- 在构建过程中这些警告(除了zstd)是否是我可以安全忽略的无害的?还是我应该担心?
- 有没有办法摆脱这些警告?
module - 为什么直接绑定 `our &foo` 不起作用,但通过动态查找间接绑定呢?
为什么在模块 TEST 之外调用时 r1 和 r2 之间存在差异?
尝试在定义它的模块 TEST 之外运行子例程 r2 时出错。
raku - Raku(do) 所依赖的延续的具体细节是什么?
在 1990 年代和 2000 年代,编程语言爱好者几乎没有讨论过定界延续的话题。它最近重新成为编程语言讨论中的重要内容。
我希望有人至少可以权威地说明 Rakudo 的延续(与 Raku 相比)是否具有下面列出的六个特征中的每一个。我多说一点关于列表之后我希望得到的那种答案。
从在线消息[1]中逐字引用(带有格式修饰),该消息由推动向 JVM 添加延续工作的人员编写:
非对称:当延续暂停或产生时,执行返回到调用者(的
Continuation.run()
)。对称延续没有调用者的概念。当他们屈服时,他们必须指定另一个延续来将执行转移到。对称延拓和不对称延拓都没有比另一个更强大,并且每个都可以用来模拟另一个。Stackful:延续可以在调用堆栈中的任何深度暂停,而不是在同一子例程中,当延续为无堆栈时(如 C# 中的情况),定界上下文开始。即延续有它自己的堆栈而不是一个单一的子程序帧。堆叠延续比无堆叠延续更强大。
Delimited:延续捕获以特定调用开始的执行上下文(在我们的例子中,是某个可运行的主体),而不是整个执行状态一直到
main()
. 定界延续严格来说比无定界延续更强大(http://okmij.org/ftp/continuations/undelimited.html),后者被认为“没有实际用处”(http://okmij.org/ftp/continuations/against-调用cc.html)。多提示:可以嵌套延续,调用堆栈中的任何位置,任何封闭的延续都可以暂停。这类似于 try/catch 块的嵌套,并抛出某种类型的异常,将堆栈展开到处理它的最近的 catch 而不仅仅是最近的 catch。嵌套延续的一个示例可以是在虚拟线程中使用类似 Python 的生成器。生成器代码可以执行阻塞 IO 调用,这将暂停封闭线程的继续,而不仅仅是生成器:https ://youtu.be/9vupFNsND6o?t=2188
One-shot/non-reentrant:每次我们继续一个暂停的延续时,它的状态都会发生变化,我们不能多次从同一个暂停状态继续它(即我们不能及时返回)。这与可重入延续不同,每次我们挂起它们时,都会返回一个表示特定挂起点的新的不可变延续对象。即延续是一个时间点,每次我们继续它时,我们都会回到那个状态。可重入的延续比不可重入的延续更强大;即,他们可以做一些仅靠一次性延续绝对不可能的事情。
可克隆:如果我们能够克隆一次性延续,我们可以提供与可重入延续相同的能力。即使每次我们继续它都会改变延续,我们可以在继续创建该时间点的快照之前克隆它的状态,以便稍后返回。
Aiui 延续没有直接暴露在 Raku 中,所以与 Raku 相关的正确答案(相对于 Rakudo)可能是“没有延续”。但这对我来说并不清楚,所以在下面,如果我很幸运,我会在其中描述我希望答案中的内容,我会假装在两个 Raku 的背景下谈论它们是有意义的和乐道作为两个不同的领域。
这是我想象的可能的答案(尽管我只是有点疯狂地猜测什么是真的):
“作为“100 年”的语言设计,Raku当前的底层语义 [执行?] 模型至少需要无堆栈的一次性多提示分隔的延续。
从理论上的观点来看,Raku 的设计永远不能扩展到要求延续是可克隆的,但理论上它可以扩展到要求它们是可堆叠的。
Rakudo 实现了当前需要的延续语义。
MoarVM 内置了对这些语义的支持,并且如果 Raku 的设计如此扩展,则可以实际跟踪理论上可能的需求扩展。
JVM 和 JS 后端有合适的 shims 来实现相同的目标,尽管会以性能为代价。JVM 后端可以切换到使用 JVM 原生的 continuation 似乎是合理的,如果它得到它们,当然前提是它们满足要求,但我目前的印象是它可能实际上可能是十年在我们需要考虑过那座桥之前,我们必须离开,或者更多。”
(或类似的东西。)
如果答案还提供了有关上述内容的更多详细信息,也许是一些代码链接,那将是一个特别棒的补充。
类似地,如果答案包括几个简短的例子,说明这种持续能力如何在当前 Raku 功能中出现,以及关于它可能如何在某一天(比如 10 年后)出现在其他功能中的猜测,那么答案就会变得过于——最出色的一个。
PS。感谢@Larry,他对事物的理解足够深入,知道延续需要成为图片的一部分;感谢 Stefan O'Rear 的贡献,包括我认为一次性多提示分隔延续的初步实现;并感谢 jnthn 让梦想成真。
脚注
1将延续作为第一类构造引入 JVM 的工作正在进行中。这一努力的主要推动者是 Ron Pressler。以上是基于他在 11 月写的一条消息。
raku - Apocalypse #1 中引入的“语义模型”是什么?
在启示录 #1中,拉里写道,我特别强调:
Raku 将支持映射到单个语义模型的多种语法。其次,该单一语义模型将依次映射到多个平台。
我对拉里在写“单一语义模型”时可能意味着什么有一些模糊的概念:
图灵完备语言/自动机;和/或
什么变成了6model;和/或
什么变成了 NQP/nqp。
(我用谷歌搜索并发现了一些讨论,例如slashdot 上的这个,但它们同样含糊不清。)
也许比回答他当时的想法更重要的是已经发生的事情。
他的表述听起来很像它可能映射到NQP 和/或 nqp(在 Raku / NQP/nqp / NQP 后端架构的中间)。
(如果是这样,大概该模型是由 nqp 等效于 Raku 的烤“指定”的?)
或者,根据 Liz++、QAST 或 RAST?
我知道我认为谁能够最好地回答我的主要问题(在标题中),但也许其他人知道?
metaprogramming - 了解 Raku 的 `&?BLOCK` 编译时变量
我真的很欣赏 Raku 的&?BLOCK
变量——它可以让你在一个未命名的块中递归,这非常强大。例如,这是一个简单的内联匿名阶乘函数:
但是,在更复杂的情况下使用它时,我有一些疑问。考虑这段代码:
这会产生这个输出(我已经缩短了块 ID):
这就是我不明白的地方:为什么&?OUTER::BLOCK
引用(基于其ID)阻止两个而不是阻止一个?正确使用OUTER
with$a
会导致它引用外部范围,但同样的事情不适用于&?BLOCK
. 只是不能使用OUTER
with&?BLOCK
吗?如果没有,有没有办法从内部块访问外部块?(我知道我可以分配&?BLOCK
给外部块中的命名变量,然后在内部块中访问该变量。我认为这是一种解决方法,但不是完整的解决方案,因为它牺牲了引用未命名块的能力,这就是的大部分&?BLOCK
力量来自于。)
其次,我对第 2 部分感到非常困惑。我明白为什么&?BLOCK
前缀 for 后面的那个是指内部块。但是为什么&?BLOCK
在后缀 for 之前的那个也指的是它自己的块呢?是否在 for 语句的主体周围隐式创建了一个块?我的理解是后缀形式在很大程度上很有用,因为它们不需要块。这是不正确的吗?
最后,为什么有些块OUTER::<$_>
在其中而有些则没有?我对第 2 块特别困惑,它不是最外面的块。
提前感谢您提供的任何帮助!(如果上面显示的任何代码行为表明存在 Rakudo 错误,我很乐意将其写为问题。)
raku - Raku 在编译时执行哪些类型检查?将来可能会改变吗?
目前(截至 2020 年 8 月)Rakudo 不在编译时对函数的返回值进行类型检查;也就是说,它不提供函数满足其返回约束的静态保证。具体来说,以下两个函数都编译为 Raku:
我有两个相关的问题:
有什么方法可以知道当前在编译时进行了什么(如果有的话)类型检查?(通过某人编写的列表、文档中的某处或 Rakudo 源中的中心位置)还是比这更临时?
这种缺乏编译时类型检查是否是有意的设计决策?或者是添加更多静态类型检查的东西,有一天会很高兴,但还没有实现?
(我熟悉 Johnathan 对Raku 中的类型/约束的性能惩罚的出色回答?,其中指出“Raku 要求写入程序的类型约束最迟在运行时强制执行。”该答案描述了避免运行的各种方法-类型检查的时间成本,但没有描述在编译时进行的类型检查(如果有的话)(这肯定会避免运行时成本!)。)
documentation - Raku 的内省可以列出不同文件/模块中的所有多候选吗?
当 proto 和 multis 在同一个模块中定义时,Type.^lookup('method').candidates
返回所有 multi 候选者的列表。但是,当 proto 位于与 multis 不同的文件/模块中时,这似乎不起作用。
有没有什么办法可以通过Raku的自省找到完整的多位候选人名单?或者除了通过源代码搜索之外别无选择?(我问是因为拥有适用于给定原型的多个候选人的完整列表将有助于文档目的。)
compilation - 为什么未执行的编译时代码会增加 Raku 的字节码大小?它会降低运行时性能吗?
考虑以下两个程序:
和
天真地,我本来希望两个程序都编译成完全相同的字节码:该CHECK
块指定要在编译结束时运行的代码;检查变量然后什么都不做对程序的运行时行为没有影响,因此(我原以为)不需要包含在编译的字节码中。
但是,编译这两个程序不会产生相同的字节码。具体来说,编译没有CHECK
块的版本会创建 24K 的字节码,而使用它的版本会创建 60K。为什么这两个版本的字节码不同?字节码的这种差异是否有(或可能有)运行时成本?(似乎必须,但我想确定)。
还有一个相关的问题:DOC CHECK
块如何适应上述情况?我的理解是,即使编译器在不使用标志运行时也会跳过DOC CHECK
块。与此一致,当给定一个像上面这样的块时--doc
,hello-world 程序的字节码不会增加大小。DOC CHECK
但是,如果块包含语句,它的大小确实会增加。use
由此,我得出结论,这use
是某种特殊情况,甚至可以在DOC CHECK
块中执行。那是对的吗?如果是这样,我应该知道其他类似的特殊形式吗?
debugging - 为什么我不能命名无符号变量 v+digit?
运行以下简单代码,检查无符号变量的行为,会产生一个奇怪的错误:
这是为什么?
class - 为什么可以修改 Raku 类的只读数组属性?
为什么只读数组属性可以在 Raku 类上修改,而标量却不能修改?
我怎样才能使@.baz
“只读”?
我的乐道版本: