Ja, das geht mit fauler Methode :
%Vor%Es gibt nichts besonderes %code% , das es faul macht, nur sein zugrunde liegender Iterator .
Angenommen, ich habe eine Sequenz, in der ich den Anfangs- und Endpunkt kenne und der Generator einfach ist. Kann ich es faul machen?
%Vor% Ich möchte diese bekannte Liste mit sich selbst eine unbekannte Anzahl von Zeiten kombinieren, aber nicht die gesamte Liste sofort generieren. Ich möchte, dass @cross
faul ist:
Ich weiß, dass ich dies durch andere einfache Dinge oder Programmierung (und meine Perl 5 Set :: CrossProduct tut genau das), aber ich bin neugierig, ob es einen einfachen und beabsichtigten Weg gibt, den ich vermisse. Irgendwie muss ich nicht alleine zählen.
Als Nebenfrage: Was macht eine Sequenz faul? Ist es nur der Endpunkt? Gibt es eine Sequenz mit einem bekannten Endpunkt, der immer noch faul sein kann, wenn der Generator unendlich viele Werte zwischen? Ich fragte mich, wie viele Informationen ich entfernen musste und versuchte so etwas:
%Vor%Immer noch, das ist nicht faul.
Die "is-faul" -Methode ist meiner Meinung nach eine falsche Bezeichnung. Das einzige was es sagt, wie Cuonglm sagte, ist, dass es nur weitergibt, dass der zugrunde liegende Iterator behauptet, er sei faul. Aber das noch bedeutet eigentlich gar nichts. Ein Iterator kann technisch Werte auf Anforderung erzeugen, behauptet aber immer noch, dass er nicht faul ist. Und umgekehrt.
Die "is-faul" -Kontrolle wird intern verwendet, um Fälle zu verhindern, in denen die Anzahl der Elemente im Voraus bekannt sein muss (wie .roll oder .pick): Wenn der Seq / Iterator behauptet, er sei faul, dann nicht eigentlich versuchen, aber scheitern oder werfen stattdessen.
Das Einzige, was .lazy tut, ist, den Iterator des Seq in einen anderen Iterator zu packen, der für lazy hält (wenn der angegebene Iterator natürlich behauptet, dass er nicht faul ist). Und stellen Sie sicher, dass es keine Werte ziehen wird, es sei denn wirklich benötigt. Also sagt das Hinzufügen von .lazy nichts darüber aus, wann Werte erzeugt werden, nur wann sie geliefert werden. Und es hilft beim Testen iteratorbasierter Logik, um zu sehen, wie sie mit einem Iterator funktionieren würden, der sich als faul bezeichnet.
Also, zurück zu der Frage: Wenn Sie sicher sein wollen, dass etwas faul ist, müssen Sie den Iterator selbst schreiben. Nachdem ich das gesagt habe, habe ich in den letzten Monaten ziemlich viel Mühe darauf verwendet, die Dinge im Kern so faul wie möglich zu machen. Bemerkenswerterweise ist xx N immer noch nicht faul, obwohl es heutzutage einen Seq erzeugt. Dass es faul wurde, brach einige Spectests auf einer tieferen Ebene, die ich bis jetzt noch nicht herausfinden konnte. Ich denke, Sie können sicher sein, dass die Dinge so faul sind, wie es im Allgemeinen Sinn macht, mit der Möglichkeit, Speicher gegenüber CPU vorzuziehen. Aber Sie werden nie die vollständige Kontrolle über die Buildins haben: Wenn Sie die vollständige Kontrolle haben wollen, müssen Sie es selbst schreiben.
Wie bereits erwähnt, bedeutet Seq
eigentlich gar nichts.
Aber ich wollte nur erwähnen, dass es eine Seite auf Rakudo Wiki gibt , die ein paar gibt Hinweise darauf, was Sie von %code% erwarten können.
Ja, das geht mit fauler Methode :
%Vor%Es gibt nichts besonderes %code% , das es faul macht, nur sein zugrunde liegender Iterator .
Sie können Folgendes machen:
%Vor%faul, indem du einfach das %code% -Schlüsselwort an der richtigen Stelle hinzufügst:
%Vor%Oder wie cuonglm gezeigt wurde, können Sie die Methode des Bereichs wie folgt aufrufen:
%Vor%Angenommen, ich habe eine Sequenz, in der ich den Anfangs- und Endpunkt kenne und der Generator einfach ist. Kann ich es faul machen?
%Vor%Ich möchte diese bekannte Liste mit sich selbst eine unbekannte Anzahl von Zeiten kombinieren, aber nicht die gesamte Liste sofort generieren. Ich möchte, dass %code% faul ist:
%Vor%Ich weiß, dass ich dies durch andere einfache Dinge oder Programmierung (und meine Perl 5 Set :: CrossProduct tut genau das), aber ich bin neugierig, ob es einen einfachen und beabsichtigten Weg gibt, den ich vermisse. Irgendwie muss ich nicht alleine zählen.
Als Nebenfrage: Was macht eine Sequenz faul? Ist es nur der Endpunkt? Gibt es eine Sequenz mit einem bekannten Endpunkt, der immer noch faul sein kann, wenn der Generator unendlich viele Werte zwischen? Ich fragte mich, wie viele Informationen ich entfernen musste und versuchte so etwas:
%Vor%Immer noch, das ist nicht faul.
Die "is-faul" -Methode ist meiner Meinung nach eine falsche Bezeichnung. Das einzige was es sagt, wie Cuonglm sagte, ist, dass es nur weitergibt, dass der zugrunde liegende Iterator behauptet, er sei faul. Aber das noch bedeutet eigentlich gar nichts. Ein Iterator kann technisch Werte auf Anforderung erzeugen, behauptet aber immer noch, dass er nicht faul ist. Und umgekehrt.
Die "is-faul" -Kontrolle wird intern verwendet, um Fälle zu verhindern, in denen die Anzahl der Elemente im Voraus bekannt sein muss (wie .roll oder .pick): Wenn der Seq / Iterator behauptet, er sei faul, dann nicht eigentlich versuchen, aber scheitern oder werfen stattdessen.
Das Einzige, was .lazy tut, ist, den Iterator des Seq in einen anderen Iterator zu packen, der für lazy hält (wenn der angegebene Iterator natürlich behauptet, dass er nicht faul ist). Und stellen Sie sicher, dass es keine Werte ziehen wird, es sei denn wirklich benötigt. Also sagt das Hinzufügen von .lazy nichts darüber aus, wann Werte erzeugt werden, nur wann sie geliefert werden. Und es hilft beim Testen iteratorbasierter Logik, um zu sehen, wie sie mit einem Iterator funktionieren würden, der sich als faul bezeichnet.
Also, zurück zu der Frage: Wenn Sie sicher sein wollen, dass etwas faul ist, müssen Sie den Iterator selbst schreiben. Nachdem ich das gesagt habe, habe ich in den letzten Monaten ziemlich viel Mühe darauf verwendet, die Dinge im Kern so faul wie möglich zu machen. Bemerkenswerterweise ist xx N immer noch nicht faul, obwohl es heutzutage einen Seq erzeugt. Dass es faul wurde, brach einige Spectests auf einer tieferen Ebene, die ich bis jetzt noch nicht herausfinden konnte. Ich denke, Sie können sicher sein, dass die Dinge so faul sind, wie es im Allgemeinen Sinn macht, mit der Möglichkeit, Speicher gegenüber CPU vorzuziehen. Aber Sie werden nie die vollständige Kontrolle über die Buildins haben: Wenn Sie die vollständige Kontrolle haben wollen, müssen Sie es selbst schreiben.
Wie bereits erwähnt, bedeutet is-lazy
eigentlich gar nichts.
Aber ich wollte nur erwähnen, dass es eine Seite auf Rakudo Wiki gibt , die ein paar gibt Hinweise darauf, was Sie von is-lazy
erwarten können.
Tags und Links perl6 lazy-evaluation