Perl 6 meldet "Kann ein Typobjekt nicht auspacken", wenn ein Array eingegeben wird

8

Ich vermute, dass dies ein Fehler in Rakudo ist, aber ich habe gerade angefangen, mit Perl 6 zu spielen, also besteht eine gute Chance, dass ich nur einen Fehler mache. In diesem einfachen Programm erscheint die Deklaration eines typisierten Arrays in einem Sub, was den Perl 6-Compiler verärgert. Durch das Entfernen der Typannotation auf dem Array wird der Compilerfehler beseitigt.

Hier ist ein einfaches Primzahlsuchprogramm:

%Vor%

Auf Rakudo Star 2016.07.1 (von den Fedora 24 Repos) gibt dieses Programm den folgenden Fehler:

%Vor%

Wenn ich die Typ-Annotation für das Vars-Array entferne, funktioniert das Programm korrekt:

%Vor%

Mache ich einen Fehler in meiner Verwendung von Perl 6, oder ist das ein Fehler in Rakudo?

    
Sultan 18.08.2016, 20:58
quelle

1 Antwort

12

Es gibt einen möglichen Fehler in Ihrem Code, der von der Typüberprüfung betroffen ist

Die angezeigte Fehlermeldung weist auf Zeile 8 hin:

%Vor%

Diese Zeile weist die Liste der Werte rechts von = der Liste der Elemente auf der linken Seite zu.

Das erste Element in der linken Liste, @vals[2*$i] , erhält eine Null.

Sie haben auf der rechten Seite keine weiteren Werte definiert, daher wird den restlichen Elementen auf der linken Seite ein Mu . Mu s funktionieren gut als Platzhalter für Elemente, die keinen bestimmten Typ haben und keinen bestimmten Wert haben. Stellen Sie sich ein Mu unter anderem wie ein Null vor, außer dass es typsicher ist.

Sie erhalten das gleiche Szenario mit dieser Golfversion:

%Vor%

Wie Sie gesehen haben, funktioniert alles gut, wenn Sie nicht eine explizite Typabhängigkeit für die Elemente des Arrays @vals angeben.

Dies liegt daran, dass die Standardtypbeschränkung für Array-Elemente Mu ist. Das Zuweisen eines Mu zu einem Element ist also in Ordnung.

Wenn Sie meinen, dass der Code verschärft wurde, könnten Sie explizit Nullen zuweisen:

%Vor%

Dies erzeugt eine (faule) unendliche Liste von Nullen auf der RHS, so dass jeder der Liste der Elemente auf der LHS eine Null zugeordnet wird.

Mit dieser Änderung funktioniert Ihr Code auch, wenn Sie eine Typbeschränkung für @vals angeben.

Wenn Sie nicht das xx Inf einführen, aber do eine Elementtyp-Einschränkung für @vals angeben, die nicht Mu ist, dann wird Ihr Code Eine Typprüfung fehlschlagen, wenn Sie versuchen, einem Element von Mu eine @vals zuzuordnen.

Der Fehler bei der Typprüfung wird in zwei Varianten auftreten, je nachdem, ob Sie Objekttypen oder native Typen verwenden.

Wenn Sie eine Einschränkung für den Objekttyp angeben (zB Int ):

%Vor%

Dann erhalten Sie einen Fehler in etwa so:

%Vor%

Wenn Sie eine Einschränkung für den nativen Typ angeben (z. B. int anstatt Int ):

%Vor%

dann versucht der Compiler zuerst, einen geeigneten nativen Wert aus dem Objektwert zu erzeugen (dies wird als "Unboxing" bezeichnet), bevor eine Typprüfung versucht wird. Es gibt jedoch keinen passenden nativen Wert, der dem Objektwert entspricht ( Mu ). Daher beschwert sich der Compiler, dass es den Wert nicht einmal auspacken kann. Schließlich, wie eingangs angedeutet, funktioniert Mu großartig als typsicheres Null, das ist nur eine Facette von Mu . Ein anderer ist, dass es ein "type object" ist. Die Fehlermeldung lautet also Cannot unbox a type object .

    
raiph 19.08.2016, 07:48
quelle

Tags und Links