gpt4 book ai didi

raku - 具有可变数量 Real 参数的脚本

转载 作者:行者123 更新时间:2023-12-04 04:29:42 25 4
gpt4 key购买 nike

我正在尝试编写一个 Raku 脚本来调用例如
script 1.2 1.117 -2 0.037
即,这个想法是创建一个 sub MAIN(@numbers)并以某种方式得到数组 @numbers作为 Real(不是 Str,不是 IntStr)。一种方法是在 for 中强制转换每个元素(如果可能)。 ,但我确信有一个更优雅的解决方案。

最佳答案

我会让读者判断以下是技术上残暴的 hack,还是看起来非常令人反感,或者两者兼而有之。但这是我在当前 Raku 语法中所知道的最接近的事情。

首先,您需要接受可变数量的参数。 (你甚至需要你的代码才能工作。我想你错了。)

而不是使用*或类似的我将使用 | .我们马上就会知道为什么。

sub MAIN( |numbers ) { ... }

接下来,我添加一个子签名。
sub MAIN( |numbers ( *@, :@reals = numbers».Real )) { ... }

这利用了:
  • 命名参数是可选的;
  • 根据绑定(bind)到签名左侧参数的参数建立默认值;
  • 隐藏此诡计,以免影响使用消息,并且(我认为)用户无法使用 --reals=... 注入(inject)值或类似的。 (实际上,说我认为他们做不到太强了。我希望他们做不到。)

  • 这要么是一个非常可怕的黑客攻击,要么就是纯粹的邪恶。不要在家庭作业中这样做!

    到目前为止的代码假定参数确实是 Real s。如果他们不是,事情就会出错。我们也需要处理这个问题。

    所以我们添加一个 subset并将其添加到签名中:
    subset Reals where *».Real».defined.all;
    sub MAIN( Reals |numbers ( *@, :@reals = numbers».Real )) { ... }

    在这里我们看到了我使用 | 的主要原因而不是 * ;这是在 slurpy 左侧编写类型的唯一方法,否则我将不得不内联 where整个事情会比现在更丑陋得难以形容。

    因此,我们最终得到:
    subset Reals where *».Real».defined.all;
    sub MAIN( Reals |numbers ( *@, :@reals = numbers».Real )) { .WHAT.say for @reals }

    显示,对于您的原始命令行:
    (Rat)
    (Rat)
    (Int)
    (Rat)

    关于raku - 具有可变数量 Real 参数的脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61219143/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com