J'ai essayé d'utiliser Pythonect, un langage de programmation de flux de données.

Aperçu

Récemment, j'ai introduit un langage appelé Pythonect que j'ai trouvé par hasard, alors j'écrirai à ce sujet. Puisqu'il s'agit encore d'une version beta du langage (environnement?), Je pense qu'il y a quelques bugs.

Qu'est-ce que Pythonect?

Pythonect http://docs.pythonect.org/en/latest/index.html

Pythonect is a new, experimental, general-purpose dataflow programming language based on Python. It provides both a visual programming language and a text-based scripting language. The text-based scripting language aims to combine the quick and intuitive feel of shell scripting, with the power of Python. The visual programming language is based on the idea of a diagram with “boxes and arrows”.

The Pythonect interpreter (and reference implementation) is a free and open source software written completely in Python, and is available under the BSD 3-Clause license.

Pythonect est un nouveau langage de programmation de flux de données expérimental et polyvalent basé sur Python. Pythonect propose à la fois un langage de programmation visuel et un langage de script basé sur du texte. Le langage de script basé sur du texte vise à être aussi intuitif et facile à combiner qu'un script shell, grâce à la puissance de Python. Le langage de programmation visuel est basé sur l'idée de diagrammes «boîte» et «flèche». Les interpréteurs Pythonect (et les implémentations de référence) sont tous écrits en Python, sont gratuits et open source, et sont disponibles sous la licence BSD 3-Clause.

Vous pouvez le considérer comme une extension approximative de la syntaxe de Python et une modification du langage de flux de données. La programmation visuelle est possible avec un logiciel appelé Dia, mais je vais l'omettre ici.

Comment installer

Pour easy_install

$ easy_install pythonect

Pour pip

$ pip install pythonect

Très facile.

HelloWorld!

$ pythonect
Python 2.7.12 (default, Nov 19 2016, 06:48:10) 
[Pythonect 0.6.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> "HelloWorld!" -> print
<MainProcess:MainThread> : HelloWorld!
'HelloWorld!'

Syntaxe de base

Cela ressemble à Python, mais il y a plus d'éléments qui ne sont pas Python. Par exemple, for et if ne peuvent pas être utilisés. Ceux qui composent les phrases composées sont probablement presque inutilisables. Il existe également des syntaxes spécifiques à pythonect.

Avant synchrone

>>> a=[1,2,3,4,5,6,7,8,9,10]
>>> a | print 
<MainProcess:MainThread> : 1
<MainProcess:Thread-4576> : 2
<MainProcess:Thread-4577> : 3
<MainProcess:Thread-4576> : 4
<MainProcess:Thread-4577> : 5
<MainProcess:Thread-4576> : 6
<MainProcess:Thread-4577> : 7
<MainProcess:Thread-4576> : 8
<MainProcess:Thread-4577> : 9
<MainProcess:Thread-4576> : 10
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Le contenu des données est récupéré de manière synchrone avec l'opérateur «|». Assurez-vous de prendre dans l'ordre de 1,2,3,4,5,6,7,8,9,10.

Avance asynchrone

>>> a -> print 
<MainProcess:MainThread> : 1
<MainProcess:Thread-4797> : 3
<MainProcess:Thread-4796> : 2
<MainProcess:Thread-4797> : 4
<MainProcess:Thread-4796> : 5
<MainProcess:Thread-4796> : 7
<MainProcess:Thread-4797> : 6
<MainProcess:Thread-4796> : 8
<MainProcess:Thread-4797> : 9
<MainProcess:Thread-4796> : 10
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Le contenu des données est récupéré de manière asynchrone avec l'opérateur ->. Dans l'exemple de transfert synchrone ci-dessus,

<MainProcess:MainThread> : 1
<MainProcess:Thread-4576> : 2
<MainProcess:Thread-4577> : 3
<MainProcess:Thread-4576> : 4
...

Cela fonctionnait comme ça, mais quand il était exécuté avec ->,

<MainProcess:MainThread> : 1
<MainProcess:Thread-4797> : 3
<MainProcess:Thread-4796> : 2
<MainProcess:Thread-4797> : 4
...

Vous pouvez voir qu'ils ne sont pas dans un ordre particulier.

Opérateur d'assignation

>>> [x=10] -> x -> print 
<MainProcess:MainThread> : 10
10

Vous pouvez mettre des valeurs dans des variables lorsque l'opérateur de transfert pythonect est activé. Cependant, il est assez difficile à utiliser.

Variables prédéfinies

Current Value ( _ )

>>> range(3) -> print _
<MainProcess:MainThread> : 0
<MainProcess:Thread-1166> : 1
<MainProcess:Thread-1167> : 2
[0, 1, 2]

_ ne récupère qu'une seule donnée du flux.

All Current Values ( _! )

>>> xrange(3) | sum(_!) | print
<MainProcess:Thread-521> : 3
3

_! Extrait toutes les valeurs du flux.

Par conséquent, en tant qu'opération

>>> sum(xrange(3))
3

Ce sera la même chose que.

Contrôle de flux

pyconnect a une expression de discrimination booléenne pendant le contrôle de flux, et le traitement suivant est effectué uniquement lorsque la valeur devient True.

Par conséquent, dans le cas de «True», tous sont affichés.

>>> range(3) | True | print
<MainProcess:MainThread> : 0
<MainProcess:Thread-1311> : 1
<MainProcess:Thread-1312> : 2
[0, 1, 2]

Au contraire, dans le cas de "False", rien n'est produit.

>>> range(3) | False | print
[False, False, False]

À titre d'exemple d'application simple, cela ressemble à ceci. Sortie uniquement lorsque la valeur du débit est 1.

>>> range(3) | _ == 1 | print
<MainProcess:Thread-1491> : 1
[False, 1, False]

Vous pouvez également diviser un flux en deux flux.

>>> range(3) | [[[_ == 0] -> print 'Zero' ],[ print _ ]]
<MainProcess:Thread-7596> : 0
<MainProcess:MainThread> : Zero
<MainProcess:Thread-7621> : 1
<MainProcess:Thread-7641> : 2
[0, 0, False, 1, False, 2]

Dans un flux, il est jugé s'il est égal à 0 et s'il est vrai, zéro est émis. Après cela, le nombre obtenu à partir du flux est sorti sans condition.

Après cela, il y a quelque chose comme une instruction switch, ce qui est rare. C'est juste très classique et semble voir la correspondance de clé de dict sur le commutateur.

>>> range(10) | _ % 3 | {0: 'Zero' , 1 : 'One' , 2 : 'Two'} | print
<MainProcess:MainThread> : Zero
<MainProcess:Thread-4146> : One
<MainProcess:Thread-4147> : Two
<MainProcess:Thread-4146> : Zero
<MainProcess:Thread-4147> : One
<MainProcess:Thread-4146> : Two
<MainProcess:Thread-4147> : Zero
<MainProcess:Thread-4146> : One
<MainProcess:Thread-4147> : Two
<MainProcess:Thread-4146> : Zero

Processus

Voir le code ci-dessous.

>>> range(3) -> print
<MainProcess:MainThread> : 0
<MainProcess:Thread-437> : 2
<MainProcess:Thread-436> : 1
[0, 1, 2]

Il y a un affichage comme <MainProcess: MainThread>. Vous pouvez voir qu'il s'exécute dans un thread dans le processus Python. Vous pouvez démarrer un processus en ajoutant & à un script s'exécutant dans un fil comme celui-ci.

>>> range(3) -> print &
<PID #29242> : 0
<PID #29266> : 2
<PID #29268> : 1
[0, 1, 2]

Essayez d'écrire FizzBuzz

FizzBuzz.p2y


range(1,20)
    -> [ x = _ ]
    -> [ flag3 = _ % 3 == 0 ]
    -> [ flag5 = _ % 5 == 0 ]
    -> [
            [     flag3 and     flag5 -> print "{0} FizzBuzz".format(x)],
            [     flag3 and not flag5 -> print "{0} Fizz".format(x)    ],
            [ not flag3 and     flag5 -> print "{0} Buzz".format(x)    ],
            [ not flag3 and not flag5 -> print "{0}".format(x)         ]
       ]

Je pense que c'est un code très similaire, mais ** ça ne marche pas **. Le code qui fonctionne réellement ressemble à ceci

$ cat ~/FizzBuzz.p2y | tr -d "\n"
range(1,20)    -> [ x = _ ]    -> [ flag3 = _ % 3 == 0 ]    -> [ flag5 = _ % 5 == 0 ]    -> [            [     flag3 and     flag5 -> print "{0} FizzBuzz".format(x)],            [     flag3 and not flag5 -> print "{0} Fizz".format(x)    ],            [ not flag3 and     flag5 -> print "{0} Buzz".format(x)    ],            [ not flag3 and not flag5 -> print "{0}".format(x)         ]       ]

C'est un point que je pense un peu. Peut-être que Perth est toujours douce. Lorsque vous le déplacez, cela ressemble à ceci.

$ cat ~/FizzBuzz.p2y | tr -d "\n" | pythonect
Python 2.7.12 (default, Nov 19 2016, 06:48:10) 
[Pythonect 0.6.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> <MainProcess:Thread-41> : 1
<MainProcess:Thread-171> : 3 Fizz
<MainProcess:Thread-172> : 2
<MainProcess:Thread-374> : 5 Buzz
<MainProcess:Thread-371> : 4
<MainProcess:Thread-571> : 6 Fizz
<MainProcess:Thread-572> : 7
<MainProcess:Thread-773> : 9 Fizz
<MainProcess:Thread-770> : 8
<MainProcess:Thread-975> : 10 Buzz
<MainProcess:Thread-971> : 11
<MainProcess:Thread-1171> : 12 Fizz
<MainProcess:Thread-1172> : 13
<MainProcess:Thread-6> : 15 FizzBuzz
<MainProcess:Thread-1371> : 14
<MainProcess:Thread-1570> : 16
<MainProcess:Thread-1573> : 17
<MainProcess:Thread-1770> : 18 Fizz
<MainProcess:Thread-1773> : 19
[False, False, False, 1, False, False, False, 2, False, 3, False, False, False, False, False, 4, False, False, 5, False, False, 6, False, False, False, False, False, 7, False, False, False, 8, False, 9, False, False, False, False, 10, False, False, False, False, 11, False, 12, False, False, False, False, False, 13, False, False, False, 14, 15, False, False, False, False, False, False, 16, False, False, False, 17, False, 18, False, False, False, False, False, 19]

C'est un code avec une atmosphère très différente. Pure FizzBuzz est sorti dans l'ordre de 1,2, Fizz, 4, Buzz ..., donc ce n'est pas une correspondance exacte, mais bon. .. .. C'est une version en langage de flux de données.

bon point

――Il fonctionne comme un langage de flux de données (il n'y a pas de langage de flux de données qui fonctionne très bien dans le monde) ――C'est bien de pouvoir utiliser la bibliothèque Python. ――Il était également très facile à lire, à nettoyer et à écrire.

Mauvais points

--Non compatible avec Python ordinaire --Le résultat traité par le flux ne peut pas être affecté à une variable --Autre la syntaxe if, for et def ne peut pas être utilisée

Impressions

Je pense que c'est assez intéressant, mais je veux quand même une fonction. Ou plutôt, j'aimerais pouvoir utiliser une autre syntaxe Python. Si elle peut être utilisée normalement comme fonction intégrée, pourquoi ne pas l'utiliser régulièrement? Je pense. Je pense que c'est le langage le plus proche des scripts shell, mais c'est aussi proche de Street, dont j'ai parlé il y a un moment. Récemment, mon intérêt personnel est une langue avec un système de typage fort, donc j'espère qu'une langue comme celle-ci sortira également dans ce domaine.

Recommended Posts

J'ai essayé d'utiliser Pythonect, un langage de programmation de flux de données.
J'ai essayé de jouer au jeu ○ ✕ en utilisant TensorFlow
J'ai essayé de dessiner une ligne en utilisant une tortue
J'ai essayé un langage fonctionnel avec Python
Essayez d'utiliser un langage de programmation probabiliste (Pyro)
J'ai essayé d'utiliser pipenv, alors prenez note
J'ai essayé d'utiliser paramétré
J'ai essayé d'utiliser argparse
J'ai essayé d'utiliser la mimesis
J'ai essayé d'utiliser aiomysql
J'ai essayé d'utiliser Summpy
J'ai essayé d'utiliser Pipenv
J'ai essayé d'utiliser matplotlib
J'ai essayé d'utiliser ESPCN
J'ai essayé d'utiliser openpyxl
J'ai essayé d'utiliser Ipython
J'ai essayé d'utiliser PyCaret
J'ai essayé de lire un fichier CSV en utilisant Python
J'ai essayé d'utiliser cron
J'ai essayé d'utiliser ngrok
J'ai essayé d'utiliser face_recognition
J'ai essayé d'utiliser Jupyter
J'ai essayé la programmation shell
J'ai essayé d'utiliser doctest
J'ai essayé d'utiliser du folium
J'ai essayé d'utiliser jinja2
J'ai essayé d'utiliser la bibliothèque de programmation fonctionnelle toolz
J'ai essayé d'utiliser la base de données (sqlite3) avec kivy
J'ai essayé d'utiliser du folium
J'ai essayé d'utiliser la fenêtre de temps
J'ai créé un jeu ○ ✕ avec TensorFlow
J'ai essayé d'héberger un exemple de modèle de Pytorch en utilisant TorchServe
[Python] J'ai essayé d'exécuter un serveur local en utilisant flask
J'ai essayé de dessiner une pseudo figure fractale en utilisant Python
J'ai essayé de lire les données d'un fichier en utilisant Node.js.
J'ai essayé d'utiliser Python (3) au lieu d'un calculateur de fonctions
J'ai essayé d'identifier la langue en utilisant CNN + Melspectogram
J'ai essayé de dessiner un diagramme de configuration à l'aide de diagrammes
[J'ai essayé d'utiliser Pythonista 3] Introduction
J'ai essayé d'utiliser easydict (mémo).
J'ai essayé la reconnaissance faciale avec Face ++
J'ai essayé d'utiliser RandomForest
J'ai essayé d'utiliser BigQuery ML
J'ai essayé d'utiliser Amazon Glacier
J'ai essayé d'utiliser git inspector
J'ai essayé 100 traitements linguistiques Knock 2020
J'ai essayé d'utiliser magenta / TensorFlow
J'ai essayé d'utiliser AWS Chalice
J'ai essayé d'utiliser l'émojinateur Slack
J'ai essayé d'héberger un modèle d'apprentissage en profondeur de TensorFlow à l'aide de TensorFlow Serving
J'ai essayé d'utiliser Tensorboard, un outil de visualisation pour l'apprentissage automatique
J'ai essayé d'automatiser [une certaine tâche] à l'aide d'une tarte à la râpe
J'ai fait un chronomètre en utilisant tkinter avec python
J'ai essayé d'écrire dans un modèle de langage profondément appris
J'ai créé un éditeur de texte simple en utilisant PyQt
J'ai essayé d'utiliser Rotrics Dex Arm