此线程中给出的代码不再起作用:如何在 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)
错误消息没有意义,因为它应该与继承的类一起使用。至少是这样。
我正在尝试$*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
我做错了什么,或者我发现了错误?
当我们将名称作为字符串时,是否可以在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) 我正在尝试将«€»作为«$»标量的别名添加,我认为使用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) (这是对: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) 我正在尝试在 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。 )
在 Windows 上安装 Raku 模块 «Termbox» 模块失败:
Powershell> zef install Termbox
Failed to find dependencies: python:from<bin>.
Run Code Online (Sandbox Code Playgroud)
我已经在 pc 上安装了 Python (v3),但这没有帮助。
是否可以修复此问题,以便可以安装模块?
(此外,该模块是否真的可以与 Powershell 一起使用?)