Kennen Sie die Sprache Pony? Einfach ausgedrückt handelt es sich um eine "statisch typisierte objektorientierte Sprache, die mit dem Actor-Modell eine parallele und parallele Verarbeitung durchführen kann". Darüber hinaus handelt es sich um eine Sprache namens ** Capabilities-Secure **, die zahlreiche Funktionen bietet, um nicht nur Typen, sondern auch Fehler im Zusammenhang mit der Parallelverarbeitung zur Kompilierungszeit zu erkennen. Unter diesen möchte ich kurz ** Referenzfähigkeit **, ein rudimentäres Konzept, durch Abschluss einführen.
Eine Gegenimplementierung, die häufig als Beispiel für die Schließung angeführt wird. Ich habe es in mehreren Sprachen implementiert, um das Verständnis der Leistungsfähigkeit der Referenzfähigkeit von Pony zu erleichtern.
Es wird davon ausgegangen, dass die folgenden Ergebnisse für beide Sprachen ausgegeben werden.
1
2
3
4
5
6
7
8
9
10
JavaScript
const createCounter = () => {
let count = 0;
return () => {
count += 1;
return count;
}
}
const counter = createCounter();
Array.from({length: 10}, () =>
console.log(counter())
)
Java
import java.util.function.*;
import java.util.stream.IntStream;
public class Counter {
public static void main(String ...args) {
final Supplier<IntSupplier> createCounter = () -> {
//Da count endgültig ist, wird der Wert mithilfe eines Arrays neu geschrieben.
final Integer[] count = {0};
return () -> {
count[0]++;
return count[0];
};
};
IntSupplier counter = createCounter.get();
IntStream.rangeClosed(1, 10).forEach(i -> {
System.out.println(counter.getAsInt());
});
}
}
Scala
object Counter extends App {
val createCounter = () => {
var count = 0
() => {
count += 1
count
}
}
val counter = createCounter()
(1 to 10).foreach { _ =>
println(counter())
}
}
Die Implementierung durch JavaScript und Scala ist im Konzept ähnlich. Ähnlich ist es, dass eine anonyme Funktion eine freie Variable annehmen, zu einem Abschluss werden und den Wert der freien Variablen neu schreiben kann.
Auf der anderen Seite kann Java nur Variablen (* 1) importieren, die mit `` `final``` als freie Variablen deklariert sind. Importieren Sie also veränderbare Objekte wie Arrays anstelle von primitiven Werten und schreiben Sie das Referenzziel neu. Sie können den Wert nur mit ändern. Dies ist ein sicheres und korrektes Verhalten für einen Verschluss, kann jedoch hinsichtlich Bequemlichkeit und Lesbarkeit hart sein.
Welchen Ansatz verfolgt Pony, um die oben aufgeführten Sprachprobleme zu lösen? Beachten Sie die Variable `count```, die im Code erscheint. Standardmäßig kann Pony den Wert einer freien Variablen, die von außerhalb des Lambda-Ausdrucks stammt, nicht umschreiben. In dieser Hinsicht verhält es sich wie Java. Wenn Sie den Wert einer Variablen neu schreiben möchten, fügen Sie dem Lambda-Ausdruck das Schlüsselwort
ref``` hinzu. Auf diese Weise kann der Lambda-Ausdruck selbst die darin enthaltenen Variablen neu schreiben. Außerdem bleibt ``
count 0, mit Ausnahme von Lambda-Ausdrücken, die` `` count
aktualisieren. Wenn Sie es wirklich aktualisieren möchten, benötigen Sie einen Ansatz wie das Einfügen in ein Array wie Java. Es scheint jedoch nur wenige solcher Fälle zu geben, sodass Sie sehr sicheren Code schreiben können.
use "collections"
actor Main
new create(env:Env) =>
let createCounter = {(): {ref(): U32} =>
var count = U32(0)
//Mit dem Schlüsselwort ref ist es möglich, den Wert von count neu zu schreiben.
{ref()(count): U32 =>
count = count + 1
count
}
}
let counter = createCounter()
for i in Range[U32](0,10) do
env.out.print(counter().string())
end
ref
Wenn Sie mit entfernten Schlüsselwörtern kompilieren, wird die folgende Fehlermeldung angezeigt: Es ist sehr leicht zu verstehen.
Error:
main.pony:9:17: cannot write to a field in a box function. If you are trying to change state in a function use fun ref
count = count + 1
Es ist ein sehr einfaches Beispiel, aber hat sich die Leistungsfähigkeit von ** funktionssicherem ** Code durch die Schließung durchgesetzt? Ich finde es attraktiv, Code durch Umschalten des Modus sicher schreiben zu können, anstatt zu vereinheitlichen, ob ein Umschreiben je nach Sprachspezifikation möglich oder unmöglich ist. Dies ist nur ein Teil der Attraktivität von Pony. Lassen Sie uns gemeinsam mit Pony's Charme in Kontakt treten!
`final``` vermieden werden, ohne dass freie Variablen neu zugewiesen werden müssen. Das Schlüsselwort
`final``` ist jedoch praktisch erforderlich, da in dieser Anwendung immer eine Neuzuweisung erfolgt.Recommended Posts