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.
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.
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!'
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.
>>> 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.
>>> 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.
>>> [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.
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.
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
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]
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.
――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.
--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
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