Wie erstelle ich eine kleine Javascript-Erweiterungssprache?

8

Ich habe meinen JS-Code vor kurzem überarbeitet und bin auf dieses Muster gestoßen:

%Vor%

Der Vorteil ist, dass es nicht-globale Variablen mit den Funktionen erstellt, die Zugriff auf alles haben, was in APP definiert ist. So kann APP.foo auf x, y, z zugreifen, und bar, ohne APP.bar() , APP.x usw. einzugeben. Alles kann auch global mit APP.bar() , APP.x usw. aufgerufen werden. Sie können sie auch verschachteln:

%Vor%

So hätte WIDGETS Zugriff auf Variablen in APP , aber nicht umgekehrt ( APP.WIDGETS.hello kann foo() verwenden, aber APP.foo muss WIDGETS.hello() verwenden).

Ich habe versucht, dieses Muster mithilfe von ERB (Ich bin auf Rails) zu erstellen, aber es wurde unordentlich. Also denke ich darüber nach, einen kleinen Quell-zu-Quell-Compiler zu schreiben - so etwas wie CoffeeScript (mit der minimalen Differenz / erweiterten Sprachphilosophie von SASS), das nur ein paar Funktionen zu alternativem Javascript zusammenstellt.

Ich möchte nur eine Kurzschrift.

Zum Beispiel würde dies zu meinem zweiten Codeblock oben kompilieren:

%Vor%

Einfach und klein - nur damit Sie die Variablen nicht im Auge behalten müssen. Würde auch gerne den Namespace so trennen (damit ich ihn in mehrere Dateien aufteilen kann):

%Vor%

Irgendwelche Gedanken darüber, wie man das macht? Ich bin mir nicht sicher über alles, aber ich denke, wenn das existierte, würde ich Javascript viel mehr mögen.

    
s12chung 14.07.2012, 18:08
quelle

2 Antworten

1

Dinge, die Sie vielleicht untersuchen möchten:

Es gibt auch einen Vorschlag für ein Modulsystem in EcmaScript 6, das in Zukunft verfügbar sein könnte: Ссылка

Nun, wenn das Ziel nur foo() anstelle von APP.foo() eingibt, dann denke ich, dass das Erstellen einer JavaScript-Obermenge für die Sprache ein bisschen anstrengend ist ...

Wenn Sie CoffeeScript verwenden, ist der Export der Variablen weniger ausführlich:

%Vor%

In der Praxis exportiert man selten jede Variable, tatsächlich sind einige von ihnen "privat". Sie können auch die Funktionen innerhalb des Objekts selbst definieren:

%Vor%     
Ricardo Tomasi 14.07.2012, 23:45
quelle
0

Was Sie beschreiben, ist das, was oft als "Modulmuster" bezeichnet wird. Es ist schön, weil Sie interne Methoden und Variablen definieren können, die "versteckt" sind und nicht zugänglich sind. Es verschmutzt auch nicht den globalen Namespace. Sie können mehr darüber hier lesen (ich glaube, das war einer der ersten Artikel über die Technik.) Auch hier und hier .

Da Sie jedoch alles "öffentlich" machen, ist es nicht so nützlich. Sie können es so machen (Testcode eingeschlossen):

%Vor%

Und Sie erhalten den gleichen Effekt mit weniger Syntax.

Ссылка

Als eine Nebenbemerkung gibt es Möglichkeiten, Code ohne einen Compiler zu schreiben, der Sie über Prototypen in die Nähe dessen bringt, was Sie suchen. Ein gutes Beispiel ist der Quellcode für jQueryUI. Ich bin mir sicher, dass andere Bibliotheken (Prototyp, MOO-Tools usw.) auch als Beispiele verwendet werden können.

    
Hogan 14.07.2012 18:53
quelle
Django: Verwenden von Annotate, Count und Distinct in einem Queryset ___ qstntxt ___

Einige statistische Informationen unserer benutzerdefinierten Hardware werden angezeigt, wenn der Benutzer nach einem Befehl im Linux-Benutzerbereich fragt. Diese Implementierung verwendet derzeit die PROC-Schnittstelle. Wir fingen an, weitere Statistikinformationen hinzuzufügen, dann stießen wir auf ein Problem, bei dem der bestimmte Statistikbefehl zweimal ausgeführt werden musste, um die gesamten Daten zu erhalten, da die PROC-Schnittstelle auf 1 Seite beschränkt war.

Wie oben erwähnt, ist der Datentransfer zwischen dem Kernel und dem Benutzerraum nicht kritisch, aber gemäß den Daten können einige Entscheidungen vom Benutzer getroffen werden. Unsere Anforderung an dieses Schnittstellendesign ist, dass es in der Lage sein sollte, Datenmengen von mehr als 8192 Bytes zu übertragen, und der Befehl muss minimale Kernel-Ressourcen (wie Sperren usw.) verwenden und muss schnell sein.

Die Verwendung von ioctl kann das Problem lösen, aber da der Befehl das Gerät nicht genau steuert, sondern einige statistische Informationen sammelt, ist es nicht sicher, ob es ein guter Mechanismus ist, wie unter Linux zu verwenden. Wir verwenden derzeit 3.4 Kernel; nicht sicher, ob Netlink in dieser Version verlustbehaftet ist (in früheren Versionen stieß ich auf Probleme wie wenn die Warteschlange voll wird, fängt Socket an, Daten zu löschen). mmap ist eine weitere Option. Kann mir jemand vorschlagen, was die beste Schnittstelle zu verwenden wäre

    
___ answer12430609 ___

Sie können einen ioctl IO-Aufruf (statt IOR, IOW oder IORW) durchführen. Ioctls können sehr nützlich sein, um Informationen zu sammeln. Auf diese Weise haben Sie eine große Flexibilität, da Sie Puffer oder Strukturen unterschiedlicher Größe übergeben können, um sie mit Daten zu füllen.

    
___ tag123linuxdevicedriver ___ Gerätetreiber übernehmen im Linux-Kernel eine besondere Rolle. Es sind programmatisch abstrahierte "Black Boxes", die ein bestimmtes Hardware-Teil auf eine wohldefinierte interne Programmierschnittstelle reagieren lassen. Sie verbergen vollständig die Details, wie das Gerät funktioniert. ___ tag123linux ___ LINUX FRAGEN MÜSSEN PROGRAMMIEREN VERWANDT SEIN. Verwenden Sie dieses Tag nur, wenn sich Ihre Frage auf das Programmieren mit Linux-APIs oder das Linux-spezifische Verhalten bezieht, nicht nur, weil Sie Ihren Code unter Linux ausführen. Wenn Sie Linux-Unterstützung benötigen, können Sie https://unix.stackexchange.com oder https://askubuntu.com ausprobieren ___