.Bool、.so、? 之间的区别所以

2024-03-24

我试图找出上述例程和 if 语句之间的区别

say $y.Bool;
say $y.so;
say ? $y;
say so $y;

会产生不同的结果。

到目前为止,对我来说唯一明显的区别是?优先级高于so. .Bool and .so似乎完全是同义词。这是正确的并且(实际上)是完整的故事吗?


为了回答你的问题,我所做的就是深入研究 Rakudo 编译器源代码。

正如您所注意到的,前缀之间的不同之处之一是解析差异。变体具有不同的优先级并且so是按字母顺序排列的,而?是标点符号。要查看控制此解析的精确代码,请查看乐堂的Grammar.nqp https://github.com/rakudo/rakudo/blob/master/src/Perl6/Grammar.nqp并在该页面中搜索prefix:sym<...>哪里的... is ?, so等等。看起来像三元(... ?? ... !! ...) https://github.com/rakudo/rakudo/blob/master/src/Perl6/Grammar.nqp#L4131-L4145变成一个if。我发现这些令牌都没有相应的名称Actions.pm6 https://github.com/rakudo/rakudo/blob/master/src/Perl6/Actions.nqp方法。作为一个有点疯狂的猜测,也许与它们相对应的代码生成是由这一部分的method EXPR https://github.com/rakudo/rakudo/blob/master/src/Perl6/Actions.nqp#L7128-L7134。 (任何人都知道或愿意遵循中的说明这篇博文 https://perl6.online/2017/12/23/playing-with-code/找出答案?)

The 中的定义Bool.pm6 https://github.com/rakudo/rakudo/blob/de4e82259be36ac9c97b56d594591ea796a1b131/src/core/Bool.pm6#L66-L100 and Mu.pm6 https://github.com/rakudo/rakudo/blob/7b10a428a5565cf122218523c1bc28c14b3d63aa/src/core/Mu.pm6#L101-L110显示:

  • In Mu.pm6方法.Bool回报False对于未定义的对象和.defined否则。反过来.defined回报False对于未定义的对象和True否则。所以这些都是默认的。

  • .defined被记录为在两个内置类中被重写 https://docs.perl6.org/routine/defined and .Bool in 19 https://docs.perl6.org/routine/Bool.

  • so, .so, and ?都调用相同的代码Bool / .Bool。理论上,类/模块可以覆盖它们,而不是或者也可以覆盖.Bool or .defined,但我不明白为什么有人会在内置类/模块或用户态类/模块中这样做。

  • not and !是相同的(除了use of ! with :exists dies https://github.com/rakudo/rakudo/blob/de4e82259be36ac9c97b56d594591ea796a1b131/src/core/Bool.pm6#L79-L81)并且都变成了对nqp::hllbool(nqp::not_i(nqp::istrue(...)))。我认为他们没有经历平常的主要原因.Bool路线是要避开标记处理Failures https://github.com/rakudo/rakudo/blob/f02856d3ecc11a11209f2def38b6ef8c341a52ff/src/core/Failure.pm6#L57-L72.

  • .so and .not中定义的方法Mu.pm6。他们只是打电话.Bool.

  • 有一些布尔按位运算符,其中包括?。他们与您的问题相距甚远,但他们的代码包含在上面的链接中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.Bool、.so、? 之间的区别所以 的相关文章

  • 类型的调用者没有这样的方法

    我创建了一个类 其中包含multi函数重载的定义 但是当我尝试调用该类和重载方法时 它会抛出错误 可以运行以产生此错误的工作示例如下所示 class Test multi test data return test data data el
  • 令牌和规则之间的真正区别是什么?

    我因为 Raku 的内置语法而被它吸引 并想尝试一下并编写一个简单的电子邮件地址解析器 唯一的问题是 我无法让它工作 在找到真正可行的东西之前 我尝试了无数次迭代 但我很难理解为什么 归根结底 一切都在改变token to rule 这是我
  • 从 Raku HTTP 客户端请求中提取 JSON

    我无法理解这个 Raku 代码有什么问题 我想从网站获取 JSON 并打印 JSON 中数组中每个项目的字段 在本例中为任何 Discourse 论坛的最新主题的标题 这是我预期可以工作的代码 但它失败了 use HTTP UserAgen
  • perl6如何获取promise的具体身份?

    我正在尝试编写在 Promise 中运行的 3 个 echo 服务器的代码 但我想知道哪个 Promise 正在执行回显 有没有办法做到这一点 no strict for 0 2 gt index result index start my
  • require 的行为(静态 + 动态)[ RAKU ]

    我的问题与以下行为有关require当与所需命名空间的静态或动态解析一起使用时 我将尝试表达我对事物的理解 1 将 require 与文字一起使用 require MODULE 在这种情况下 编译器会检查 MODULE 是否已被声明为符号
  • Perl 6 的 shell() 使用哪个 shell?

    Perl 6 的shell https docs perl6 org routine shell向 shell 发送命令 但没有说明那是什么 我一直得到bash在我的机器上 但我不知道我是否可以信赖它 perl6 e shell Q ech
  • Perl 6 分别捕获重复匹配组?

    我相信 Perl 6 提供了单独捕获重复组的能力 而不是早期的风格 您只能捕获最后一个组或整个匹配的组字符串 有人可以举一个很好的例子来说明如何使用 Perl 6 的这个很棒的功能吗 例如 我需要捕获此正则表达式的所有匹配组 and say
  • Perl 6 有无限的 Int 吗?

    我有一个任务 我想找到距离目标最近的字符串 因此 编辑距离 而不是同时生成它们 我想我应该使用高水位线技术 我猜是低水位线 同时初始化最近的编辑距离Inf这样任何编辑距离都会更近 use Text Levenshtein my string
  • 如何在 Perl 6 中打开字符串上的文件句柄?

    在 Perl 5 中 我可以像这样打开字符串上的文件句柄 open my kfh lt message gt payload 我有一个使用字符串作为文件句柄并将其传递给open method my fh new IO Zlib open m
  • Perl 6 中有快速并行“for”循环吗?

    给定一些对 1 到 500000 之间的每个数字进行一些数学 转换的代码 我们有选择 简单的for循环 for 500000 gt i my result i 2 Str 在我的不科学基准测试中 这需要 2 8 秒 最规范的并行版本在一个P
  • 如何引用语法中先前匹配的项目?

    我正在尝试解析 BibTeX 作者字段 并将其拆分为单独的作者 这将帮助我重写每个作者的姓名首字母 这是一个最小的例子 use v6 my str Rockhold Mark L and Yarwood RR and Selker John
  • IF 语句中 OR 和 AND 运算符的中断条件

    If 语句和任何其他布尔比较足够智能 可以在评估时在第一个 FALSE 值处停止A and B and C and D评估时首先为 TRUE 值A or B or C or D 这种行为的名称是什么 这是编译器优化吗 如果是这样 有没有办法
  • Inline::Perl5 的列表返回给出项目的计数,而不是列表

    一些简单的 Inline Perl5 代码返回一个列表 但它似乎返回项目的计数而不是实际的列表 更改涉及的项目数量会更改计数 use Inline Perl5 my p5 Inline Perl5 new my perl5 code q t
  • 使用 NativeCall 将 C 库函数合并到 Perl6 中

    我正在尝试使用lgamma来自 C 的math h在 Perl6 中 我如何将其合并到 Perl6 中 我努力了 use NativeCall sub lgamma num64 gt num64 is native Str say lgam
  • 具有类型约束的无符号“变量”是否可以重新绑定? [复制]

    这个问题在这里已经有答案了 EDIT 关闭以支持https stackoverflow com questions 69231506 what are the rules for re binding 这是我在更清楚地理解我在这个问题中想问
  • 在 Perl 6 中使用正则表达式和 .contains 进行过滤

    我经常需要过滤元素array字符串 包含一些子字符串 例如一个字符 因为它可以通过匹配来完成regex或与 contains方法 我决定做一个小测试以确保 contains更快 因此更合适 my array aa cc my constan
  • 更改 $*DISTRO 值以进行测试

    我需要测试一个功能包括这一行 https github com rakudo rakudo commit 0a2eef8fb0adb24164999a2b71c415fd11fe748a diff 4ce1542a6f014c9a003fe
  • 如何将perl6文件编译为exe

    我正在使用基于 Windows 上 MoarVM 构建的 perl6 版本 我创建了一些 perl6 文件并想将其编译为 exe 我尝试了以下方法 perl6 target MAST r pl gt r 现在我想将 r 编译为可执行文件 我
  • Perl 6 可以根据排序规则进行排序或比较吗?

    The cmp操作员 https docs perl6 org language operators infix cmp适用于代码编号 或者至少我认为它是这样做的 因为文档对此没有明确说明 并且没有提及任何本地化内容 我可以按照其他排序规则
  • Perl 6 语法与我认为的不匹配

    我正在做代码出现第 9 天 http adventofcode com 2017 day 9 您坐了一会儿并记录了流的一部分 您的谜题输入 这些字符代表组 开头的序列 并结束于 在一个组内 有零个或多个其他东西 用逗号分隔 要么是另一个组

随机推荐

  • 如何使用SQL Server数据库项目

    我正在运行安装了 SSDT SQL Server Data Tools 的 SQL Server 2012 和 VS 2010 我的开发数据库使用存储过程 函数 CLR 对象等 它有大约 500GB 的生产数据快照 我创建了 SQL Ser
  • 如何正确处理我的 WebGL 上下文以避免 16 WebGL 上下文错误? [复制]

    这个问题在这里已经有答案了 这是此问题的后续问题 该主体的实时 WebGL 上下文超过 16 个 丢失了最近最少使用的一个 https stackoverflow com q 33800600 2715716 在该问题中 我们发现当您刷新
  • 如何使用 NSJSONSerialization

    我有一个 JSON 字符串 来自 PHP 的json encode 看起来像这样 id 1 name Aaa id 2 name Bbb 我想将其解析为我的 iPhone 应用程序的某种数据结构 我想对我来说最好的事情就是拥有一个字典数组
  • 如何使用 HTML5 音频标签创建自动播放列表?

    如何使用 HTML5 的音频标签创建自动播放列表 我想要实现的是一个只有播放 暂停按钮大 30x25 px 的播放器 播放器在页面加载时自动播放 当歌曲结束时 它会自动播放下一首歌曲 尝试在播放列表中包含 3 4 首歌曲 查看这篇文章 使用
  • ng-select 中的对象及其属性

    我一直在试图弄清楚如何使用数组 if 对象作为 ng select 指令的键值 这是我想使用的数据 scope selectValues name Options 1 value 11 name Options 2 value 22 nam
  • 如何从 key.pk8 和certificate.pem 生成 Android 密钥库?

    所以今天我终于将我的 SDK 更新到 22 0 0 但这会在 AndroidManifest xml 中创建一个错误android debuggable false 这意味着我无法再从外部签名和压缩我自己的 APK 我一直使用自己的 key
  • scanf 格式说明符从一组字符中读取零个或多个字符

    我需要对读取字符串中可以包含的字符非常严格 我有一系列空格 后面跟着一个字符 后面跟着一系列空格 例子 c c 我需要找到一个格式说明符 它允许我忽略该字符 但前提是它是这个特定字符而不是任何其他字符 这个序列 e 应该被中止 I trie
  • Azure ARM 模板(取决于)

    寻求一些指导和解释dependsOn 我在模板中看到有两种在模板中提供依赖项的方法 一种方法是提供resourceId另一种方法是使用提供字符串值concat 我试图理解两者之间的区别 Example concat Microsoft Ne
  • 错误:指针和整数之间的比较

    我正在尝试编写一个可以处理重定向的简单 shell 但是 我得到 错误 指针和整数之间的比较 我明白为什么会出现错误 但我不确定如何修复它 args 声明为 static char args 512 这是我收到错误的代码 if args l
  • Visual Studio上的Nuget包推送403错误

    我创建了一个视觉工作室类库 我想将其作为一个包发送给 Nuget 我用了视觉工作室包管理器安慰 命令如下 nuget spac 你好nuget nuget 包 hellonuget nuspec nuget 推送 hellonuget 1
  • 如何在“表格列表”中仅显示一次表格标题,以便将表格拆分为多个页面

    我正在使用 R 包 xtable and knitr 和乳胶包 longtable and hyperref 准备一份文件 我的一张桌子很长并且分成多页 事实证明 表列表 显示了该表出现的每个页码 但所有超链接都将我带到了该表的开头 我的问
  • CSS Sprites 在 IE 中不起作用[8/7/6]

    我正在尝试 CSS 使用精灵来动画我的风险矩阵 它在 Firefox 和 Chrome 中工作得很好 但图像不会显示在 IE 中 代码如下 不想将整个内容粘贴到此处 但摘录显示了模式 dl dd a a dd dd a a dd dl
  • 隐藏文件夹 C# [重复]

    这个问题在这里已经有答案了 可能的重复 C 获取不包括隐藏文件的文件列表 https stackoverflow com questions 2418270 c get a list of files excluding those tha
  • android 背景重复-y

    我有一个图像 我想将其放置在右侧并在 y 轴上重复它 HTML 中类似于 背景 url img png 右重复 y 在android中可以做到这一点吗 当我将此位图设置为背景时 它不在右侧
  • 检查 FTP 服务器上的可用空间

    我正在运行一个构建脚本 其中三个可执行文件 每个 100mb 被上传到 FTP 服务器 由于 FTP 服务器空间问题 第一次上传可能会失败 因此我们的构建过程会失败 这意味着我必须从服务器释放一些空间并再次运行构建脚本 这是浪费时间 我想在
  • Python 子模块在 python 3.7 中正确导入,但在 3.6 中则不然

    我的目录结构如下 test init py m1 init py f1 py f2 py test init py是空的 test m1 init py包含一行import test m1 f1 test m1 f1 py包含一行impor
  • 如何将复杂对象传递到 ASP.NET MVC 中的另一个视图?

    我正在尝试将一个复杂的对象 可以序列化 如果有帮助的话 传递给另一个视图 目前 这是我在某些控制器方法中拥有的代码 User user New User Name Fred Email xxxx return RedirectToActio
  • 为什么每个逻辑 CPU 在多线程情况下都有自己的 CR3 寄存器?

    当我们有一个支持某种形式的多线程的 CPU 时 每个逻辑 CPU 都有它自己的一组寄存器 至少 包括 CR3 寄存器 由于我们在执行不同线程时正在处理同一进程的虚拟地址空间 并且永远不会发生上下文切换 切换同一进程的线程时TLB缓存也不会失
  • conda环境安装后无法导入包

    我尝试安装gdal我的 conda 环境中的包 我激活了 gcpy 环境并使用安装了 gdal 包conda install c conda forge gdal 该软件包安装成功 但是 当我尝试导入包时 出现错误 In 1 import
  • .Bool、.so、? 之间的区别所以

    我试图找出上述例程和 if 语句之间的区别 say y Bool say y so say y say so y 会产生不同的结果 到目前为止 对我来说唯一明显的区别是 优先级高于so Bool and so似乎完全是同义词 这是正确的并且