Gibt es Sprachen, in denen der Geltungsbereich so definiert ist, dass er sich nicht auf die eingeschlossenen Funktionen erstreckt? Mit anderen Worten, gibt es eine Sprache, in der ein Code wie der folgende (Python-ähnliche Syntax):
%Vor% würde einen Fehler verursachen, weil x nicht innerhalb der Funktion fact
?
Gibt es im Allgemeinen Sprachen, in denen der Bereich der Funktion any keine darin definierten Funktionen enthält?
Bearbeiten : Danke für die informativen Kommentare. Der Grund, warum ich darüber nachdachte, ist, dass die Situation einer internen Funktion, die Zugang zu der gesamten Umgebung hat, die durch ihre beinhaltenden Funktionen bereitgestellt wird, mir verdächtig nahekommt an der Situation, die Joe Armstrong in seinem Argument gegen OOP :
Weil das Problem mit Objektorientierte Sprachen haben sie bekam all diese implizite Umgebung, die Sie tragen mit ihnen herum. Sie Ich wollte eine Banane, aber was du hast, war eine Gorilla hält die Banane und die gesamter Dschungel.
Wichtig ist auch, dass ich höre, dass die Sprache Newspeak jedoch keinen globalen Namespace hat Ich habe keine Ahnung, wie es funktioniert.
Ich kann mir vorstellen, dass das Problem, das in Brians Kommentar unten angesprochen wurde, eingebaute Funktionen (Funktionen, die aus __builtins__
in Pythonspeak oder System in vielen anderen Sprachen importiert wurden) künstlich vom Interpreter / Compiler in jede Funktion eingeführt wird. Schließlich werden sie fast immer speziell in der Sprache behandelt. Eine andere Möglichkeit besteht darin, sie als Methoden eines Objekts als Parameter für die Funktion zu übergeben oder als Modul von innen zu importieren.
Ich werde versuchen, grob zu skizzieren, wie es in Newspeak funktioniert.
Jeder Code, den Sie schreiben, muss in einem Modul sein. Modul ist eine Art von Klasse, da Klassen in Newspeak andere Klassen enthalten können. Ein Modul ist im Wesentlichen eine Klasse der obersten Ebene - eine Klasse, die nicht in einer anderen Klasse enthalten ist. Das Besondere an Newspeak ist, dass Sie nicht auf etwas außerhalb Ihres Moduls verweisen können .
Wie drucken Sie, um in Newspeak zu trösten? Drucken gehört zur Console-Klasse (a.k.a. Smalltalk's Transcript), die Teil des Platform-Moduls ist. Um in der Konsole drucken zu können, würde Ihr Modul einen Platform-Konstruktorparameter verwenden, die Konsole von der Plattform abrufen, die Konsole in einem Steckplatz speichern und sie dann zum Drucken verwenden.
Im Grunde ist es so, als würde die Abhängigkeitsinjektion auf der Sprachebene erzwungen. Die Sprache IDE und Runtime helfen Ihnen beim Packen und Bootstrappen Ihres Programms, aber wenn Sie nach weiteren Details suchen, gehen Sie zu Gilad Brachas Blog , siehe dieser Beitrag zum Beispiel oder Newspeak Modules .
P.S. Neusprech ist weder unpraktisch noch unbrauchbar, denn es wurde im industriellen Umfeld verwendet und hat jetzt eine kleine (aber wachsende) Open-Source-Gemeinschaft. Newspeak ist sehr neu und entwickelt sich, sicher, aber aus eigener Erfahrung - es ist ziemlich einfach und macht Spaß, Programme zu schreiben.
Ich glaube, Sie könnten eine Programmiersprache erstellen, in der der globale Geltungsbereich beispielsweise durch ein assoziatives Array ersetzt wird, das Funktionen und Objekte enthält, die dann als Arbeitsumgebung an jede aufgerufene Funktion übergeben werden.
Betrachten Sie das folgende Beispiel. Wenn Sie in einem regulären Python-Programm sind, würden Sie etwas schreiben:
%Vor%In einem Programm ohne Globals schreiben Sie lieber so etwas:
%Vor%und dieser Code würde in einem Kontext etwa wie folgt ausgeführt:
%Vor%In einem Programm mit dieser Art von Ansatz und ohne Globals könnten die Funktionen innerhalb des Programms fast vollständig von allem isoliert werden, außer was sie durch die Argumente, die sie erhalten, erreichen können. Sie könnten dann auch alternative Umgebungen für Funktionen erstellen und diese dann in "Gefängnissen" ausführen. Bibliotheken und Funktionen sind wie elektronische Komponenten in einer Schaltung, wo Sie sie brauchen, aber sind auch in der Lage, die Stücke zu verbinden, was Sie wollen. Eine Programmiersprache, die dieses Muster entworfen hat, könnte vielleicht einen syntaktischen Zucker enthalten, um automatisch eine implizite "Standard" -Umgebung an Funktionsaufrufe zu übergeben, aber Sie könnten sie immer explizit dazu zwingen, jede beliebige alternative Umgebung zu verwenden.
Wenn Sie beispielsweise in einer globaleren Sprache über eine Bibliothek verfügen, die für den Zugriff auf Daten im Dateisystem oder Netzwerk des Betriebssystems ausgelegt ist, können Sie eine alternative Umgebung bereitstellen und die E / A überwachen oder die Bibliothek verwenden Ihr eigenes virtuelles Dateisystem oder eine VPN-Verbindung anstelle des regulären Dateisystems und Netzwerks.
Realistisch könnte so etwas niemals existieren. Berücksichtigen Sie Folgendes: Wenn Sie auf der Konsole drucken, woher kommt das Konsolenhandle? Wenn Sie auf eine Funktion verweisen, woher kommt diese Funktion? Es existiert sicher nicht physisch auf dem Stapel der Funktion, von der Sie es aufgerufen haben. Das stimmt - es ist global. Die Realität ist, dass Sie ohne Globals niemals auf etwas verweisen können, das nicht direkt in Ihrem Stack oder Heap ist - was dank DEP keine Maschinenanweisungen bedeutet. Und für den Haufen, woher würdest du einen Haufen bekommen? Sie können keine Betriebssystemfunktion aufrufen, um Ihnen tatsächlich neuen Speicher zuzuweisen - das ist ein globaler Vorgang.
Theoretisch könnten Sie eine solche Sprache oder ein solches Programm erstellen, aber die Realität ist, dass es mehr wie Brainfuck wäre als alles, was tatsächlich nutzbar ist.
Tags und Links programming-languages newspeak