小编Arn*_*mer的帖子

Raku rebless 不再适用于继承类

此线程中给出的代码不再起作用:如何在 Perl 6 中重新启用对象?

我去年写了这段代码,然后它就起作用了。现在它没有:

class Person { ; }
class Woman is Person { ; }
my $tom = Person.new;
my $lisa = Woman.new;

say $tom.^name;  # -> Person
say $lisa.^name; # -> Woman

Metamodel::Primitives.rebless($tom, Woman);
# -> New type Woman for Person is not a mixin type
Run Code Online (Sandbox Code Playgroud)

错误消息没有意义,因为它应该与继承的类一起使用。至少是这样。

该文档没有帮助;https://docs.raku.org/routine/rebless

raku

9
推荐指数
2
解决办法
281
查看次数

在二进制模式下Perl 6 $*ARGFILES.handles?

我正在尝试$*ARGFILES.handles,它似乎以二进制模式打开文件.

我正在编写一个zip-merge程序,它会从每个文件中打印一行,直到没有更多行要读取.

#! /usr/bin/env perl6

my @handles = $*ARGFILES.handles;

# say $_.encoding for @handles;

while @handles
{
  my $handle = @handles.shift;
  say $handle.get;
  @handles.push($handle) unless $handle.eof;
}
Run Code Online (Sandbox Code Playgroud)

我这样调用它:zip-merge person-say3 repeat repeat2

它失败了:无法在./zip-merge第7行的块中以二进制模式对句柄执行'get'

指定的文件是文本文件(以utf8编码),我收到非可执行文件和可执行文件(使用perl6代码)的错误消息.

注释掉的行说出我给它的每个文件的utf8,所以它们不应该是二进制的,

perl6 -v:这是基于MoarVM版本2018.10构建的Rakudo版本2018.10

我做错了什么,或者我发现了错误?

perl6

7
推荐指数
1
解决办法
117
查看次数

当我们将名称作为字符串时调用过程?

当我们将名称作为字符串时,是否可以在Perl 6中调用过程?

    sub AAA { say "ok"; }
    my $sub = "AAA";
    # &$sub(); or something ?
Run Code Online (Sandbox Code Playgroud)

我知道调度表是一个更好的主意:

    my %table; %table<a> = &AAA();
    &(%table<a>); # Execute "AAA"
Run Code Online (Sandbox Code Playgroud)

我问,因为调用一个我们将名称作为字符串的方法是可能的:

    say pi."$_"() for <Int Real Str>;
Run Code Online (Sandbox Code Playgroud)

perl6

7
推荐指数
1
解决办法
206
查看次数

Perl6:使用S语添加标记

我正在尝试将«€»作为«$»标量的别名添加,我认为使用lang语来完成它是一种方法。但是perl6.doc完全没有提到S语。

我已阅读以下内容:

并查看了Slang :: Roman和Slang :: Tuxic模块。

结果是此文件(ScalarEU.pm6):

use nqp;

unit module ScalarEU2;

sub EXPORT(|)
{
  my role Euscalar
  {
    token sigil:sym<$> { '€' | '$' }
  }

  my Mu $MAIN-grammar := nqp::atkey(%*LANG, 'MAIN');
  my $grammar := $MAIN-grammar.HOW.mixin($MAIN-grammar, Euscalar);

  $*LANG.define_slang('MAIN', $grammar, $*LANG.actions);

  {}
}
Run Code Online (Sandbox Code Playgroud)

然后是一个使用它的程序(称为hello):

use lib "lib";

use ScalarEU;

sub MAIN ($name)
{
  say "Hello, €name!";
}
Run Code Online (Sandbox Code Playgroud)

但这行不通,或者说行不通:

$ ./hello Tom
Hello, €name!
Run Code Online (Sandbox Code Playgroud)

(我以这种方式编写了程序,以免崩溃。)

我还没有添加动作类,但是“令牌标记”的设置方式应该不需要吗?但是这个假设是基于11年的文章,可能是错误的。

另外,https//github.com/rakudo/rakudo/issues/2404表示$ * LANG已过时,而改用$?LANG。REPL同意:

> $*LANG
Dynamic variable …
Run Code Online (Sandbox Code Playgroud)

perl6

6
推荐指数
1
解决办法
114
查看次数

Raku rebless 和多个类

(这是对:Raku rebless 不再使用继承类的后续操作

我试图想出一个更复杂的用例,但我无法让代码工作。

这个想法是一个 Person 类,具有用于 Child 和 Adult 的 mixin 子类。我们有一个 Child 对象,并在年龄超过 18 岁时将类型更改为 Adult。

这个显然失败了,因为 Adult 是 Parent 上的 mixin,而不是 Child 上的:

class Person
{
  has Int $.age is rw = 0;

  method happy-birthday
  {
    $.age++;
    # Metamodel::Primitives.rebless($, Adult) if $.age == 18;
  }

  method can-vote
  {
    ...;
  }
}

constant Adult = Person but role { method can-vote { True  } }

constant Child = Person but role
{
  method can-vote …
Run Code Online (Sandbox Code Playgroud)

raku

6
推荐指数
1
解决办法
186
查看次数

Raku:在 Windows 上安装 Gnome::Gtk3

我正在尝试在 Windows pc 上安装 Raku 模块 «Gnome::Gtk3» 模块,但没有成功。

Powershell> zef install Gnome::Gtk3
Run Code Online (Sandbox Code Playgroud)

这会因大量“无法找到本机库”消息而失败。

我已经用 choco 和 git 安装了 Raku。并修复了路径。由于缺少文档,仅此一项就需要相当长的时间才能弄清楚。

我已经安装了 Gtk,如下所述:https : //www.gtk.org/docs/installations/windows

但是 Raku 无法找到这些库。这是可以工作的东西,还是我必须使用适用于 Linux 的 Windows 子系统?

(我知道 «GTK::Simple» 模块,但不能使用它作为替代,因为它缺乏对键盘中断的支持 - 我需要。我已经安装了它,因为它声明它也安装了 GTK dll。 )

gtk3 zef raku

5
推荐指数
1
解决办法
178
查看次数

Raku:在 Windows 上安装 Termbox

在 Windows 上安装 Raku 模块 «Termbox» 模块失败:

Powershell> zef install Termbox
Failed to find dependencies: python:from<bin>.
Run Code Online (Sandbox Code Playgroud)

我已经在 pc 上安装了 Python (v3),但这没有帮助。

是否可以修复此问题,以便可以安装模块?

(此外,该模块是否真的可以与 Powershell 一起使用?)

zef raku

5
推荐指数
1
解决办法
80
查看次数

标签 统计

raku ×4

perl6 ×3

zef ×2

gtk3 ×1