Kürzlich habe ich eine Sprache namens Pythonect eingeführt, die ich zufällig gefunden habe, also werde ich darüber schreiben. Da es sich immer noch um eine Beta-Version der Sprache (Umgebung?) Handelt, gibt es meiner Meinung nach einige Fehler.
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 ist eine neue experimentelle, universelle Datenfluss-Programmiersprache, die auf Python basiert. Pythonect bietet sowohl eine visuelle Programmiersprache als auch eine textbasierte Skriptsprache. Die textbasierte Skriptsprache soll dank der Leistungsfähigkeit von Python so intuitiv und einfach zu kombinieren sein wie ein Shell-Skript. Die visuelle Programmiersprache basiert auf der Idee von "Box" - und "Pfeil" -Diagrammen. Die Pythonect-Interpreter (und Referenzimplementierungen) sind alle in Python geschrieben, kostenlos und Open Source und stehen unter der BSD 3-Klausel-Lizenz zur Verfügung.
Sie können sich das als grobe Erweiterung der Python-Syntax und als Modifikation der Datenflusssprache vorstellen. Visuelle Programmierung ist mit der Software Dia möglich, aber ich werde sie hier weglassen.
Für easy_install
$ easy_install pythonect
Für pip
$ pip install pythonect
Sehr leicht.
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!'
Es sieht aus wie Python, aber es gibt mehr Elemente, die nicht Python sind. Zum Beispiel für und wenn nicht verwendet werden kann. Wahrscheinlich sind diejenigen, aus denen zusammengesetzte Sätze bestehen, fast unbrauchbar. Es gibt auch einige Pythononect-spezifische Syntaxen.
>>> 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]
Der Inhalt der Daten wird synchron mit dem Operator |
abgerufen. Achten Sie darauf, in der Reihenfolge 1,2,3,4,5,6,7,8,9,10 herauszunehmen.
>>> 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]
Der Inhalt der Daten wird asynchron mit dem Operator ->
abgerufen. Im obigen Beispiel für die synchrone Übertragung
<MainProcess:MainThread> : 1
<MainProcess:Thread-4576> : 2
<MainProcess:Thread-4577> : 3
<MainProcess:Thread-4576> : 4
...
Es hat so funktioniert, aber als es mit ->
ausgeführt wurde,
<MainProcess:MainThread> : 1
<MainProcess:Thread-4797> : 3
<MainProcess:Thread-4796> : 2
<MainProcess:Thread-4797> : 4
...
Sie können sehen, dass sie in keiner bestimmten Reihenfolge sind.
>>> [x=10] -> x -> print
<MainProcess:MainThread> : 10
10
Sie können Werte in Variablen einfügen, während der Pythononect-Übertragungsoperator aktiviert ist. Es ist jedoch ziemlich schwierig zu bedienen.
Current Value ( _ )
>>> range(3) -> print _
<MainProcess:MainThread> : 0
<MainProcess:Thread-1166> : 1
<MainProcess:Thread-1167> : 2
[0, 1, 2]
_
ruft nur ein Datenelement aus dem Datenfluss ab.
All Current Values ( _! )
>>> xrange(3) | sum(_!) | print
<MainProcess:Thread-521> : 3
3
_!
Extrahiert alle Werte aus dem Fluss.
Daher als Operation
>>> sum(xrange(3))
3
Es wird das gleiche sein wie.
pyconnect hat während der Flusssteuerung einen Bool-Unterscheidungsausdruck, und die nächste Verarbeitung wird nur ausgeführt, wenn der Wert True wird.
Daher werden im Fall von "True" alle ausgegeben.
>>> range(3) | True | print
<MainProcess:MainThread> : 0
<MainProcess:Thread-1311> : 1
<MainProcess:Thread-1312> : 2
[0, 1, 2]
Im Gegenteil, im Fall von "Falsch" wird nichts ausgegeben.
>>> range(3) | False | print
[False, False, False]
Als Beispiel für eine einfache Anwendung sieht es so aus. Ausgabe nur, wenn der Durchflusswert 1 ist.
>>> range(3) | _ == 1 | print
<MainProcess:Thread-1491> : 1
[False, 1, False]
Sie können einen Fluss auch in zwei Flüsse aufteilen.
>>> 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]
In einem Fluss wird beurteilt, ob es 0 ist, und wenn es wahr ist, wird Null ausgegeben. Danach wird die aus dem Durchfluss erhaltene Zahl bedingungslos ausgegeben.
Danach gibt es so etwas wie eine switch-Anweisung, was selten vorkommt. Es ist einfach sehr klassisch und scheint die Übereinstimmung der Diktatschlüssel auf dem Schalter zu sehen.
>>> 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
Siehe den Code unten.
>>> range(3) -> print
<MainProcess:MainThread> : 0
<MainProcess:Thread-437> : 2
<MainProcess:Thread-436> : 1
[0, 1, 2]
Es gibt eine Anzeige wie "<MainProcess: MainThread>". Sie können sehen, dass es in einem Thread im Python-Prozess ausgeführt wird. Sie können einen Prozess starten, indem Sie einem Skript, das in einem Thread wie diesem ausgeführt wird, "&" hinzufügen.
>>> 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) ]
]
Ich denke, es ist ein sehr ähnlicher Code, aber ** es funktioniert nicht **. Der Code, der tatsächlich funktioniert, sieht folgendermaßen aus
$ 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) ] ]
Dies ist ein Punkt, den ich für ein bisschen halte. Vielleicht ist Perth immer noch süß. Wenn Sie es tatsächlich bewegen, sieht es so aus.
$ 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]
Es ist ein Code mit einer ganz anderen Atmosphäre. Pure FizzBuzz wird in der Größenordnung von 1,2, Fizz, 4, Buzz ... ausgegeben, es ist also keine exakte Übereinstimmung, aber gut. .. .. Es ist eine Datenfluss-Sprachversion.
――Es funktioniert als Datenflusssprache (es gibt keine Datenflusssprache, die auf der Welt sehr gut funktioniert). ――Es ist schön, die Python-Bibliothek verwenden zu können. ――Es war auch sehr leicht zu lesen, sauber und leicht zu schreiben.
Ich finde es ziemlich interessant, aber ich möchte immer noch eine Funktion. Oder besser gesagt, ich wünschte, ich könnte eine andere Python-Syntax verwenden. Wenn es normalerweise als integrierte Funktion verwendet werden kann, warum nicht regelmäßig verwenden? Ich denke. Ich denke, es ist die Sprache, die Shell-Skripten am nächsten kommt, aber es liegt auch in der Nähe von Street, über die ich vor einiger Zeit gesprochen habe. In letzter Zeit ist mein persönliches Interesse eine Sprache mit einem starken Typensystem, daher hoffe ich, dass eine Sprache wie diese auch in diesem Bereich herauskommt.
Recommended Posts