J'ai essayé d'ajouter un post-incrément à CPython. Présentation et résumé

J'ai essayé d'ajouter un post-incrément à CPython

Implémentation de l'incrément dans CPython. Cette fois, je présenterai les grandes lignes de l'augmentation et les résultats obtenus. Dans la prochaine édition d'implémentation, nous examinerons la méthode d'implémentation par ordre chronologique.

Liste de liens

Les trois fois plus une édition supplémentaire. Présentation et résumé de l'ajout de post-incrémentation à CPython [J'ai essayé d'ajouter un post-incrément à CPython Implémentation Liste de toutes les modifications apportées par l'ajout de post-incrémentation à CPython Édition supplémentaire de l'ajout de post-incrémentation à CPython

faire glisser

Tout d'abord, veuillez avoir une brève diapositive qui résume les résultats.

spécification

Cela fonctionne comme ça.


>>> 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

L'incrément peut être implémenté non seulement pour les variables mais également pour les listes et les variables membres. De plus, l'évaluation est renvoyée en même temps que la variable est réécrite.

Résultats obtenus

Voici ce que j'ai trouvé en regardant le code source de CPython 3.5.0 lors de la mise en œuvre des incréments.

À propos du fonctionnement de CPython

Le script Python est exécuté comme suit.

--Analyse des phrases - Include/tokenizer.h - Parser/tokenizer.c

Pour changer la syntaxe Python

Il existe une page appelée 23. Changer la grammaire de CPython dans le Guide du développeur Python, vous pouvez donc vous y référer. Cela dit, cela ne suffit pas, j'ai donc résumé quelques changements plus spécifiques.

  1. Lorsque vous voulez changer le mot réservé en un autre mot comme "Je veux écrire pour chacun au lieu de pour"
  1. Si vous souhaitez utiliser une chaîne qui n'est pas utilisée en Python, telle que "Je veux pouvoir utiliser! Au lieu de pour"
  1. Si vous souhaitez ajouter une grammaire qui utilise des symboles déjà utilisés dans d'autres significations -Par exemple, lister la notation d'inclusion[x + 1 | x <- range(10)]Changer pour pouvoir écrire (|Est déjà utilisé dans le sens du bit OU) -Étant donné que les jetons gravés sont transmis à l'analyseur généré automatiquement en séquence, l'opération sur les bits est effectuée au moment précédent.|Ou lister la notation d'inclusion|J'ai pensé qu'il serait bon de juger si c'était le cas, mais j'ai abandonné parce qu'il faudrait du temps pour le faire à partir de zéro. ――Je pense que cela devrait être fait par l'analyseur en premier lieu, mais la grammaire Python, qui est à l'origine LL (1), n'est-elle plus LL (1)? → Il semble nécessaire de lire la partie génération automatique de l'analyseur que je n'ai pas touché et de connaître la capacité de l'analyseur --Je n'ai pas tout à fait compris (pour cette raison, dans cette expérience, j'ai implémenté en utilisant $ au lieu de | et j'ai triché)

  2. Si vous souhaitez définir une syntaxe d'enrobage de sucre --En plus de tokenizer. *, Grammar, il semble bon de le refaire dans un arbre synonyme avec Python / ast.c.

  3. Si vous souhaitez ajouter une grammaire qui dépasse le cadre des expressions et des phrases ou qui n'existe pas dans celles existantes --tokenizer, Grammar, .. Parfois, compile.c devrait aussi cracher du beau code d'octet. Si nécessaire, définissez également un nouveau code opération et son interprétation

Au fait, si vous apportez une modification destructrice à une mélodie, vous ne pourrez pas compiler la bibliothèque au moment de make install.

Dans cette implémentation d'incrément, il y avait au moins une expression ++ 2 et une erreur a été générée (c'est un mystère pourquoi elle est écrite en premier lieu).


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

J'ai essayé d'ajouter un post-incrément à CPython. Présentation et résumé
J'ai essayé d'ajouter un post-incrément à l'implémentation CPython
J'ai essayé d'ajouter un post-incrément à l'édition CPython Extra
J'ai essayé d'ajouter un post-incrément à CPython. Liste de toutes les modifications
J'ai essayé d'ajouter des appels système et des planificateurs à Linux
J'ai essayé d'utiliser PyEZ et JSNAPy. Partie 1: Aperçu
J'ai implémenté DCGAN et essayé de générer des pommes
J'ai essayé d'ajouter VPS à la connexion ConoHa ~ SSH
[Introduction au PID] J'ai essayé de contrôler et de jouer ♬
J'ai essayé de déboguer.
J'ai essayé de lire et d'enregistrer automatiquement avec VOICEROID2 2
J'ai essayé d'implémenter et d'apprendre DCGAN avec PyTorch
J'ai essayé de lire et d'enregistrer automatiquement avec VOICEROID2
J'ai essayé d'implémenter Grad-CAM avec keras et tensorflow
J'ai essayé d'installer scrapy sur Anaconda et je n'ai pas pu
J'ai essayé d'apprendre PredNet
J'ai essayé d'organiser SVM.
J'ai essayé d'implémenter PCANet
J'ai essayé de réintroduire Linux
J'ai essayé de présenter Pylint
J'ai essayé de résumer SparseMatrix
jupyter je l'ai touché
J'ai essayé d'implémenter StarGAN (1)
J'ai essayé de prédire et de soumettre les survivants du Titanic avec Kaggle
J'ai essayé de combiner Discord Bot et la reconnaissance faciale-pour LT-
J'ai essayé d'obtenir les informations du Web en utilisant "Requests" et "lxml"
J'ai essayé d'illustrer le temps et le temps du langage C
J'ai essayé d'afficher l'heure et la météo d'aujourd'hui w
[Introduction au modèle de maladie infectieuse] J'ai essayé de m'adapter et de jouer
J'ai essayé d'énumérer les différences entre java et python
J'ai essayé de créer une interface graphique à trois yeux côte à côte avec Python et Tkinter
J'ai essayé d'implémenter Deep VQE
J'ai essayé de toucher Python (installation)
J'ai essayé de visualiser les signets volant vers Slack avec Doc2Vec et PCA
J'ai essayé de mettre en place une validation contradictoire
J'ai essayé de laisser Pepper parler des informations sur l'événement et des informations sur les membres
J'ai essayé d'expliquer l'ensemble de données de Pytorch
J'ai essayé l'authentification vocale Watson (Speech to Text)
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
J'ai touché l'API de Tesla
J'ai essayé de créer des taureaux et des vaches avec un programme shell
J'ai essayé de m'organiser à propos de MCMC.
J'ai essayé de détecter facilement les points de repère du visage avec python et dlib
J'ai essayé d'extraire des noms de joueurs et de compétences d'articles sportifs
J'ai essayé d'implémenter Realness GAN
J'ai essayé de déplacer le ballon
J'ai essayé d'estimer la section.
J'ai essayé de déplacer l'image vers le dossier spécifié en faisant un clic droit et un clic gauche
J'ai essayé de visualiser la tranche d'âge et la distribution des taux d'Atcoder
J'ai essayé d'exprimer de la tristesse et de la joie face au problème du mariage stable.
[Deep Learning from scratch] J'ai essayé d'implémenter la couche sigmoïde et la couche Relu
J'ai essayé de convertir la chaîne datetime <-> avec tzinfo en utilisant strftime () et strptime ()
J'ai essayé d'apprendre l'angle du péché et du cos avec le chainer
J'ai essayé de faire la reconnaissance de caractères manuscrits de Kana Partie 2/3 Création et apprentissage de données
J'ai essayé d'extraire et d'illustrer l'étape de l'histoire à l'aide de COTOHA
J'ai essayé de vérifier et d'analyser l'accélération de Python par Cython
[Chaîne de Markov] J'ai essayé de lire des citations et des émotions négatives en Python.
J'ai essayé de classer Oba Hanana et Otani Emiri par apprentissage profond
J'ai créé un exemple pour accéder à Salesforce en utilisant Python et Bottle