从 Perl 6 中的异常处理程序返回值

2023-11-26

我一直在尝试编写一个执行以下逻辑的 Perl 6 表达式:计算子表达式并返回其值,但如果这样做会导致引发异常,则捕获异常并返回固定值。

例如,假设我想除两个数字并使表达式计算为-1如果发生错误。在 Ruby 中我可能会这样写:

quotient = begin; a / b; rescue; -1; end

在 Emacs Lisp 中可以写成:

(setq quotient (condition-case nil (/ a b) (error -1))

我的第一次 Perl 6 尝试是这样的:

sub might-throw($a, $b) { die "Zero" if $b == 0; $a / $b }
my $quotient = do { might-throw($a, $b); CATCH { default { -1 } } };

但在这儿$quotient最终结果是未定义的,无论是否$b为零。

看起来返回的值是CATCH被忽略,或者至少在doc page描述了异常是如何工作的,所有的CATCH身体只做有副作用的事情,比如伐木。

该页面提到try作为备选。例如我可能会写:

my $quotient = try { might-throw($a, $b) } // -1;

我发现这是一个相当平庸的解决方案。一方面,我正在评估的表达式可能确实具有未定义的值,并且我无法将其与引发异常的情况区分开来。另一方面,我可能想根据抛出的异常的类回退到不同的值,但是try只是把它们全部吞掉。我可以放我自己的CATCH块在try来区分异常,但随后我又回到了上面的第一种情况,其中来自CATCH被忽略。

Perl 6 的异常处理可以像我上面表达的那样进行吗?

EDIT:

当前的答案内容丰富,但过于狭隘地关注除法运算符的语义。我稍微重写了这个问题,以使异常捕获的主要问题更加核心。


catch 块不起作用的原因是除以零本身并不是错误。 Perl6 很乐意让您除以零,并将该值存储为 Rat。当您想以有用的方式显示所述老鼠时,就会出现问题(IEsay它)。这时您会返回一个失败,如果不处理,就会变成异常。

所以你有几个选择。你可以检查$b在你做之前$q :

$q = $b == 0 ?? -1 !! $a / $b; 

或者,如果您想保留真实值(请注意,您可以内省 Rat 的分子和分母,而不会导致除以零错误)say你可以使用.perl or .Num版本。

两者都给出了十进制表示形式Rat with .perl giving <1/0> and .Num giving Inf当你有一个0分母。

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

从 Perl 6 中的异常处理程序返回值 的相关文章

随机推荐

  • 旋转下拉列表在滚动时跳跃

    为什么我的旋转器在滚动时会跳跃 我只是做以下事情 ArrayAdapter
  • 为什么可以等待 Rx observable? [复制]

    这个问题在这里已经有答案了 我刚刚注意到await关键字可以与 Rx Observable 一起使用 例如 await Observable Interval TimeSpan FromHours 1 我非常确定它只能与任务结合使用 那么是
  • 如何刷新数据网格

    我创建 dojox grid datagrid 并填充数组中的内容 如示例所示页面上的最后一个示例 在一段时间内 我在代码中更改了该数组的值 如何刷新该网格的内容 如何从更改的数组加载新数据 要更改网格中的值 您需要更改网格存储中的值 网格
  • 找到到任何子串的最小汉明距离的最快方法?

    给定一个长字符串L和一个较短的字符串S 约束条件是L length 必须 gt S length 我想找到之间的最小汉明距离S和任意子串L长度等于S 长度 让我们为此调用该函数minHamming 例如 minHamming ABCDEFG
  • 在 Laravel 中,使用 App::make('') 而不是构造函数注入有什么缺点吗?

    通常我只会通过构造函数注入依赖项 但是当父类具有依赖项并且必须将它们传递给所有子类时 它会变得非常冗长 另一种方法是使用 this gt dependancy App make Dependancy 单独在父类中 那么父构造函数和子构造函数
  • ASCII 调整和十进制调整指令如何工作?

    我一直在努力理解 x86 汇编语言的 ASCII 调整指令 我在互联网上看到所有信息告诉我不同 的事情 但我想这只是以不同形式解释的同一件事 但我仍然不明白 谁能用伪代码解释一下为什么AAA AAS我们必须从 AL 的低位半字节中加 减 6
  • 如何使用 DOJO 动态显示和隐藏整个 TabContainer?

    DOJO 似乎有一些怪癖 我特别需要在页面加载时隐藏 TabContainer 但在用户单击按钮后变得可见 我尝试的第一件事是设置 style display none 来启动 然后在单击事件上设置 style display block
  • 在 C++/CLI 中使用 unique_ptr 时出现链接器错误

    我目前正在转换我的实例auto ptr to unique ptr 但我遇到了一个问题 它在代码的 C 部分中运行良好 但在我的托管 C CLI 层 该软件同时使用 C 和 C 中执行此操作时 我收到链接错误 它编译得很好 但在链接时会中断
  • eval 与函数构造函数

    我正在读关于eval在 MDN 上 它似乎表明有点 better 替代eval是使用一个函数构造器 MDN 似乎强调 与使用函数构造函数相比 使用函数构造函数的安全风险较小eval as 第三方代码可以看到调用 eval 的范围 这可能会导
  • 初学者摇摆

    我想创建一个简单的 Swing 应用程序 然而 我对 Swing 的经验非常非常少 我想创建一个单窗口应用程序 每 5 分钟刷新一次我所做的屏幕抓取内容 我正在使用 Clojure 来编写代码 我认为 Swing 是解决这个问题的方法 但如
  • sscanf 行为/返回值

    我是一名学习 C 的新手 并试图从在线讲座中理解以下代码 它扫描字符串中的整数 如果遇到字符 则 sscanf 失败 int n char c if sscanf string d c n c 1 return the integer el
  • 如何选择 git rebase 的合并策略?

    git rebase手册页提到 X
  • Mongo查询需要很长时间。怎么让它更快呢?

    我在 Node js 中使用 mongoose 驱动程序 我的架构 let sendResultSchema mongoose Schema emailId String email String letterId String sende
  • 为什么编译器没有预定义 NULL

    这个问题困扰了我一段时间 我从未见过 NULL 的不同定义 它总是 define NULL void 0 是否有任何体系结构对 NULL 进行了不同的定义 如果是这样 为什么编译器不为我们声明这一点 C 2011 标准 在线草稿 6 3 2
  • JavaScript 中的“调用堆栈”与“执行上下文堆栈”相同吗?

    我经常在很多文章中看到 调用堆栈 像这样 https hackernoon com understanding js the event loop 959beae3ac40 ec22 但在ECMAScript文档中找不到 调用堆栈 调用堆栈
  • 编译器如何区分“vector::insert”的两种变体?

    我正在实现一个简单的std vector 那里有两个insert功能 template
  • 双击 UITableViewCell

    我想要单击和双击UITableViewCell 我已经为UITableview 我怎样才能做到这一点 正确的方法是将 UITapGestureRecognizer 添加到 tableView 上 UITapGestureRecognizer
  • lucene 中的高亮显示性能非常慢

    当搜索频繁出现的术语时 Lucene 4 6 荧光笔的性能非常慢 搜索速度很快 100 毫秒 但突出显示可能需要一个多小时 Details 使用了很棒的文本语料库 1 5GB 纯文本 性能并不取决于文本是否被分割成更小的部分 也使用 500
  • 如何更改nginx中的$request_uri?

    我们获取信息来自 SERVER REQUEST URI 不是来自 GET or POST 我想定义 request uri改变 example to module controller action 请注意 我不想触发重定向 我尝试使用下面
  • 从 Perl 6 中的异常处理程序返回值

    我一直在尝试编写一个执行以下逻辑的 Perl 6 表达式 计算子表达式并返回其值 但如果这样做会导致引发异常 则捕获异常并返回固定值 例如 假设我想除两个数字并使表达式计算为 1如果发生错误 在 Ruby 中我可能会这样写 quotient