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

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 lors de l'ajout de post-incrémentation à CPython Édition supplémentaire de l'ajout de post-incrémentation à CPython

Extra: Faites la notation d'inclusion de liste comme Haskell

À l'origine, l'incrémentation était une tâche pour s'entraîner à changer la notation d'inclusion de liste. Cependant, il a été plus difficile à mettre en œuvre que prévu, en partie parce que l'incrément ne correspondait pas au concept de conception. Quel que soit le concept, la modification de la notation d'inclusion de liste peut être effectuée en environ cinq minutes si vous avez les connaissances à ce jour.

Tout d'abord, nous utilisons DOSS_HASKELL au lieu de DOSS_INCREMENT pour rendre les modifications indépendantes. Par conséquent, la configuration est la suivante.

CFLAGS="-O0 -g -DDOSS_INCREMENT=1 -DDOSS_HASKELL=1" ./configure --prefix="/home/denjo/piyothon_install"

spécification

La notation d'inclusion de liste actuelle de Python est la suivante.

lst = [x for x in range(10) if x >= 5]

D'autre part, Haskell est comme suit.

lst = [x | x <- [0..9], x >= 5]

Le Python modifié peut être exprimé comme suit.

lst = [x $ x <- range(10), x >= 5]

De plus, ici|ne pas$Est utilisé|Puisqu'il a une opération comme somme logique, il sera reconnu comme cela.

changements

Il n'y a que trois changements:

Grammar


comp_iter: comp_for | comp_if
#ifdef DOSS_HASKELL
comp_for: ('for' | '$') exprlist ('in' | '<-') or_test [comp_iter]
#endif
comp_if: ('if' | ',') test_nocond [comp_iter]

token.h


#ifdef DOSS_INCREMENT
#define INCREMENT 58
#define PRE_INCREMENT 61
#endif
#ifdef DOSS_HASKELL
#define LARROW 59
#define DOLLAR 60
#endif

toknizer.c


case '<':
        switch (c2) {
        case '>':               return NOTEQUAL;
        case '=':               return LESSEQUAL;
        case '<':               return LEFTSHIFT;
        #ifdef DOSS_HASKELL
        case '-':               return LARROW;
        #endif
        }
        break;

Changements

En fin de compte, tout ce que j'ai fait a été de réécrire la grammaire pour autoriser $, <-, ”,” au lieu de for, in, if, et d'enregistrer le jeton. En passant, avec cela seul, vous pouvez également écrire de manière désagréable comme [x ** 2 $ x in range (10), x% 2 == 0]. Aussi, c'est mignon que les expressions conditionnelles après , doivent être connectées par ʻetau lieu d'être séparées par,`.

Commentaire

Q. Pourquoi cela fonctionne-t-il même si je n'ai pas défini la signification de pour et dans? Est-ce un alias pour for ou in?

A. En premier lieu, le sens n'est pas défini pour et dans. Pour for, le jeton qui vient après for est une variable qui est utilisée à plusieurs reprises, et le jeton qui vient après cela est ..., et la grammaire n'est pas définie. car est juste un délimiteur, et ce qu'il faut faire avec les jetons qui le suivent est défini dans Grammaire comme ce qui vient après pour, pas pour pour.

Grammar


comp_iter: comp_for | comp_if
comp_for: 'for' exprlist 'in' or_test [comp_iter]
comp_if: 'if' test_nocond [comp_iter]

Ce qui précède est la partie Grammaire qui correspond à la notation d'inclusion de liste avant la réécriture. En regardant comp_for, il est défini que le mot suivant'for' est appelé comme ʻexprlist. De plus, après «in», «or_test» doit être appelé. Par conséquent, quelles définitions (comment l'arborescence de syntaxe est créée et quel code d'octet est exécuté) sont fixées pour ʻexprlist, ʻor_test et comp_for` plutôt que pour et in. On peut dire que

Divertissement: essayez de mettre en œuvre le pré-incrément

Si vous créez un nouveau code d'opération UNARY_PRE_INCREMENT et faites attention à l'ordre d'empilement dans ceval.c, vous pouvez le créer en 30 minutes.

Recommended Posts

J'ai essayé d'ajouter un post-incrément à l'édition CPython Extra
J'ai essayé d'ajouter un post-incrément à l'implémentation CPython
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. Liste de toutes les modifications
J'ai essayé de résumer les modules d'Ansible - l'édition Linux
J'ai essayé d'ajouter VPS à la connexion ConoHa ~ SSH
J'ai essayé de déboguer.
J'ai essayé d'ajouter des appels système et des planificateurs à Linux
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é d'extraire des caractères des sous-titres (OpenCV: édition tesseract-ocr)
J'ai essayé d'implémenter SSD avec PyTorch maintenant (édition du modèle)
J'ai essayé d'implémenter Deep VQE
J'ai essayé de créer l'API Quip
J'ai essayé de toucher Python (installation)
J'ai essayé d'expliquer l'ensemble de données de Pytorch
J'ai essayé l'authentification vocale Watson (Speech to Text)
J'ai touché l'API de Tesla
J'ai essayé de m'organiser à propos de MCMC.
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 résoudre l'édition du débutant du livre des fourmis avec python
J'ai essayé de créer un linebot (implémentation)
J'ai essayé de résumer la gestion des exceptions Python
J'ai essayé d'implémenter PLSA en Python
J'ai essayé d'utiliser Azure Speech to Text.
J'ai essayé d'implémenter Autoencoder avec TensorFlow
J'ai essayé de résumer la commande umask
J'ai essayé d'implémenter la permutation en Python
J'ai essayé de créer un linebot (préparation)
J'ai essayé de reconnaître le mot de réveil
J'ai essayé de commencer avec Hy
J'ai essayé d'implémenter PLSA dans Python 2
J'ai essayé de classer le texte en utilisant TensorFlow
J'ai essayé de faire un signal avec Raspeye 4 (édition Python)
J'ai essayé de résumer la modélisation graphique.
J'ai essayé d'implémenter ADALINE en Python
J'ai essayé de laisser optuna résoudre le nombre
J'ai essayé d'estimer le rapport de circonférence π de manière probabiliste
J'ai essayé de toucher l'API COTOHA
J'ai essayé d'implémenter PPO en Python
J'ai essayé d'implémenter CVAE avec PyTorch
J'ai créé une API Web
J'ai essayé de résoudre TSP avec QAOA
[Python] J'ai essayé de calculer TF-IDF régulièrement
J'ai essayé de gratter la météo Yahoo (édition Python)
J'ai essayé de toucher Python (syntaxe de base)
J'ai fait de mon mieux pour retourner au Lasso
J'ai essayé d'exécuter du code Python à partir de .Net en utilisant Pythonnet (édition Hallo World)
J'ai essayé de rendre le deep learning évolutif avec Spark × Keras × Docker 2 Multi-host edition
J'ai essayé de prédire l'année prochaine avec l'IA