|
Freitag, 9. Mai 2008
Das heutige Code-Snippet zeigt ein paar neue feine NG-Features: Das Scripten von Java-Klassen (courtesy of Jürg Lehnis Code), vernünftiges Loopen durch den Inhalt einer Java-Map mittels Iterator und Array Comprehension. Here we go, Fragen in den Kommentaren sind wie immer willkommen.
hannes@x20:~/svn/helma-ng$ java -jar shell.jar
helma> importModule('helma.rhino');
helma> var Map = helma.rhino.extendJavaClass(java.util.Map);
helma> Map.prototype.__iterator__ = function() {
> return Iterator(this.entrySet());
> };
helma> var map = new java.util.HashMap();
helma> map.put("foo", "bar");
helma> map.put(1, 2);
helma> map.put("me", "you");
helma> map
{1.0=2.0, me=you, foo=bar}
helma> [entry.key for (entry in map)];
1,me,foo
helma> [entry.value for (entry in map)];
2,you,bar
(Nicht sachdienliches Feedback von der Shell hab ich weggelassen, das nur zur Information.)
Ich glaub mit dem Javateil bin ich fertig für 0.2. Jetzt testen und dokumentieren und das eine oder andere Modul portieren. Es gibt übrigens eine Mailingliste für NG (die alte helma-dev Liste wird stillgelegt), und das trac ist auch bereit.
Noch ein cooles Beispiel, destructuring assignment in for loops, direkt von hier geklaut:
helma> var obj = { width: 3, length: 1.5, color: "orange" };
helma> for (var [name, value] in Iterator(obj)) {
> writeln(name, "is", value);
> }
color is orange
width is 3
length is 1.5
könntest du noch deine code snippets die du mit chris erstellt hattest (HopObject style) posten, oder mir per mail schicken. danke.
Sicher. Die grösste Änderung, die ich mit Chris gemacht hab, ist die, dass importModule via wildcard alle Scripts in einem Verzeichnis in einen Module scope reinschlürfen kann. Sprich das folgende Statement erzeugt einen scpoe names Directory mit allen *.js files im Verzeichnis Directory:
importModule("Directory.*");
Damit ist es dann relativ leicht, einen HopObject-ähnlichen Prototypen bzw Constructor zu bauen:
importModule('helma.skin');
var Helma1Proto = createHopObject("Helma1Proto");
var path = new Helma1Proto();
function createHopObject(name) {
var proto = importModule(name + ".*");
var ctor = proto[name] || function() {};
proto.renderSkin = renderSkin;
ctor.prototype = proto;
return ctor;
}
function renderSkin(name, param) {
var context = {'this': this, 'param': param};
var resource = this.getResource(name + '.skin');
var skin = helma.skin.createSkin(resource, this);
helma.skin.renderSkin(skin, context, this);
}
Helma1Proto ist hier ein Verzeichnis mit files wie actions.js, functions.js, macros.js und main.skin. Dieser konkrete Code schaut auch, ob es einen constructor mit dem Namen des Prototyps gibt und verwendet ihn im Fall. Die einzigen Macro-Handler sind derzeit "this" und "param", alles andere ist halt Fleissaufgabe.
Ich weiss nicht, ob das so bleibt, das ist auch der Grund, warum ichs noch nicht gepostet habe (der wildcard-support für importModule ist seit gestern im svn). Das Verhalten bei wildcards ist nicht wahnsinnig intuitiv (logischer wäre es, für jedes file einen eigenen subscope zu machen), aber es ist halt wahnsinng praktisch für Helma1-Kompatibilität. Ich schätze hier ist ein Guter Platz as any um anzufangen drüber nachzudenken.
PS: importModuleAs() gibt es seit gestern nicht mehr, dafür nimmt importModule() einfach ein optionales zweites Argument.
PPS: Code Reloaden geht auch noch nicht bei wildcard modules, man muss beim Testen öfters neu starten.
danke für den code schnippsel - das hilft sehr
apropo code posten - wie ist denn jetzt das vorgehen für den zugriff auf die sandbox. ich würde gerne meine zwischenstände dort (zur diskussion) einchecken.
Wenn es um svn geht, dann geht die einfache variante - account/passwort beantragen und einchecken - schon jetzt. Ich denke das sollte über die mailing liste passieren, in diesem fall also die neue helma-ng liste.
Was wiki-space betrifft (für snippets und demo-code vielleicht oft geeigneter) wirds bald (minuten? stunden?) einen dedicated space auf helma.org geben, wahrscheinlich hier.
habe mal die trac startseite eingerichtet.
https://dev.helma.org/trac/helma/wiki/WikiStart
vielleicht kannst du da mal drüber schauen.
super super super! danke!
Log in to add your comment!
|