Inkrement in CPython implementiert. Dieses Mal werde ich den Umriss des Inkrements und die erzielten Ergebnisse vorstellen. In der nächsten Implementierungsausgabe werden wir uns die Implementierungsmethode in chronologischer Reihenfolge ansehen.
Alle drei Male plus zusätzliche Ausgabe. Übersicht und Zusammenfassung des Hinzufügens von Post-Inkrement zu CPython [Ich habe versucht, CPython [Implementierung] ein Post-Inkrement hinzuzufügen (http://qiita.com/DOSS_INCREMENT/items/8b050847145f635211e2) Liste aller Änderungen, die durch Hinzufügen eines Post-Inkrements zu CPython vorgenommen wurden Zusätzliche Ausgabe zum Hinzufügen von Post-Inkrement zu CPython
Bitte haben Sie zunächst eine kurze Zusammenfassung der Ergebnisse Folie.
Es funktioniert so.
>>> i=0
>>> i++
0
>>> i
1
>>> lst=[x for x in range(5)]
>>> lst
[0, 1, 2, 3, 4]
>>> lst[0]++
0
>>> lst
[1, 1, 2, 3, 4]
>>> class cls:
... a=5
...
>>> cls_obj=cls()
>>> cls_obj.a
5
>>> cls_obj.a++
5
>>> cls_obj.a
6
Inkrement kann nicht nur für Variablen, sondern auch für Listen und Mitgliedsvariablen implementiert werden. Außerdem wird die Auswertung gleichzeitig mit dem Umschreiben der Variablen zurückgegeben.
Folgendes habe ich beim Betrachten des CPython 3.5.0-Quellcodes bei der Implementierung von Inkrementen gefunden.
Das Python-Skript wird wie folgt ausgeführt.
Im Python-Entwicklerhandbuch finden Sie eine Seite mit dem Namen 23. Ändern der CPython-Grammatik, auf die Sie verweisen können. Das ist jedoch nicht genug, deshalb habe ich einige spezifischere Änderungen zusammengefasst.
[x + 1 | x <- range(10)]
Ändern, um schreiben zu können (|
Wird bereits im Sinne von Bit ODER verwendet)
-Da die geschnitzten Token nacheinander an den automatisch generierten Parser übergeben werden, wird die Bitoperation zum Zeitpunkt davor ausgeführt.|Oder Listeneinschlussnotation|Ich dachte, es wäre gut zu beurteilen, ob es so ist, aber ich gab auf, weil es einige Zeit dauern würde, dies von Grund auf neu zu machen.
――Ich denke, es sollte in erster Linie vom Parser durchgeführt werden, aber ist die Python-Grammatik, die ursprünglich LL (1) ist, nicht mehr LL (1)? → Es scheint notwendig, den Teil der automatischen Generierung des Parsers zu lesen, den ich nicht berührt habe, und die Fähigkeit des Parsers zu kennenÜbrigens, wenn Sie eine destruktive Änderung an einer Melodie vornehmen, können Sie die Bibliothek zum Zeitpunkt der Installation nicht kompilieren.
In dieser Inkrement-Implementierung gab es mindestens einen Ausdruck "++ 2" und es wurde ein Fehler ausgegeben (es ist ein Rätsel, warum er überhaupt so geschrieben wurde).
compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | with_stmt | funcdef | classdef | decorated
if_stmt: 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite]
while_stmt: 'while' test ':' suite ['else' ':' suite]
for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite]
Recommended Posts