Vor einer Weile brauchte ich eine Lösung, um Bibliotheken in VBScript zu importieren.
VBScript hat als Referenz keine integrierten Importfunktionen. Die traditionelle Methode zum Importieren von Dateien besteht darin, SSI zu verwenden, die den Inhalt des Includees wortwörtlich in den Incluender ablegt. Dies ist aus mehreren Gründen weniger als optimal: Es gibt keine Möglichkeit, mehrfache Inklusionen zu vermeiden, es gibt keine Möglichkeit, ein Bibliotheksverzeichnis anzugeben usw. Deshalb habe ich meine eigene Funktion geschrieben. Es ist ziemlich einfach, executeGlobal
mit einem Dictionary zu verwenden, um importierte Module zu verfolgen und das Ganze in ein Objekt für die Kapselung einzubinden:
Wie auch immer, das funktioniert ziemlich gut, aber es ist eine Menge Arbeit, wenn ich die Bibliothek nicht benutze. Ich würde es gerne träge machen, so dass die Dateisystemsuche, das Laden und das Ausführen nur dann erfolgt, wenn die Bibliothek tatsächlich verwendet wird. Dies wird durch die Tatsache vereinfacht, dass auf die Funktionen jeder Bibliothek nur über ein Singleton-Objekt in einem globalen Bereich mit dem gleichen Namen wie die Bibliothek zugegriffen wird. Zum Beispiel:
%Vor%%Vor%
Es scheint also so zu sein, dass der träge Importeur StringBuilder als Objekt definiert, das beim Zugriff StringBuilder.lib lädt und sich selbst ersetzt.
Leider wird dies durch VBScripts wegen des Mangels an Metaprogrammierungskonstrukten erschwert. Zum Beispiel gibt es kein Analog zu Rubys method_missing
, was die Implementierung trivial gemacht hätte.
Mein erster Gedanke war, dass die Funktion import
% executeGlobal
verwendet, um eine globale Funktion namens StringBuilder zu erstellen, die keine Argumente annimmt, die wiederum StringBuilder.lib lädt und dann executeGlobal
verwendet, um sich selbst zu "shadowen" Funktion) mit dem StringBuilder Singleton. Es gibt zwei Probleme damit: erstens, executeGlobal
zu verwenden, um eine Funktion zu definieren, die sich dann mit executeGlobal
überschreibt, scheint im Allgemeinen eine eher flüchtige Idee zu sein, und zweitens stellt man fest, dass man in VBScript nur eine Funktion überschreiben kann mit einer Variablen, wenn die betreffende Funktion eingebaut ist. Oooookay.
Der nächste Gedanke, den ich hatte, war das gleiche, außer dass executeGlobal
anstelle der Funktion durch eine Variable verwendet wurde, um die Funktion durch eine andere Funktion zu ersetzen, die einfach den Singleton zurückgab. Dies würde erfordern, dass der Singleton in einer separaten globalen Variablen gespeichert wird. Die Nachteile dieses Ansatzes (abgesehen von der inhärenten Unkosenessität der Strategie) bestehen darin, dass der Zugriff auf den Singleton zusätzlichen Funktionsaufruf hinzufügt und dass der Singleton aufgrund der Parsing-Exzentrizitäten des Interpreters keine Standardeigenschaften mehr verwenden kann.
Alles in allem ist es ein ziemlich klebriges Problem, und die seltsamen Eigenheiten von VBScript sind nicht hilfreich. Irgendwelche Ideen oder Vorschläge wären willkommen.
Tags und Links vbscript asp-classic import metaprogramming