2013-06-11 13 views
5

Ich bin nicht in der Lage, das kompilierte Überfall-Konzept zu verstehen. Es gibt keinerlei Beispiele im Netz. Wie würde ich einfache Code-Snippets von interpretiert in kompiliert ändern?Vom interpretierten zum kompilierten Raubüberfall

Zum Beispiel:

listUsersH :: AppHandler() 
listUsersH = do 
    users <- liftIO $ getColList "users" 
    let userListS = mapSplices userLinkS users 
    heistLocal (bindSplice "users" userListS) $ render "list-users" 
    where 
    userLinkS d = runChildrenWithText [("user",T.pack $ at "uname" d)] 

Wie würde ich die einfache Kombination von "runChildren" tun "mapSplices", "bindSplice" und "machen" mit kompilierten heist?

Ich verstehe, dass das Konzept anders ist und es gibt keine "heistLocal" .. Aber ich muss jetzt zurückgehen und neu lernen, wie die grundlegenden Dinge wie die Anzeige einer Reihe von Datensätzen in einer "für jeden" Schleife Weise. Kann jemand das klären und ein einfaches Beispiel wie oben, aber mit kompiliertem Überfall zeigen?

Im Moment weiß ich nicht einmal, wie man einfache variable Substitution mit kompiliertem Raubüberfall macht. Zum Beispiel dieses:

simpleString = "Insert me..." 
insertString = heistLocal (bindSplices spl) $ render "tst" 
where 
    spl = [("var", textSplice simpleString)] 

Sie mir jemand mit den Grundlagen helfen oder mich mit einigen minimalen Beispielen an einen Ort verweisen. Ich habe die Snap-Website-Dokumente gelesen.

Antwort

1

Kompilierte Spleiße sind definitiv schwieriger zu bearbeiten. Zum einen müssen alle Spleiße vorne statisch verbunden sein. Dies erfordert eine deutliche Veränderung der Denkweise. Vorher konnten Sie mithilfe von heistLocal Spleiße als Objekte mit begrenztem Umfang anzeigen, die bei Bedarf gebunden werden konnten. Sie können in Handlern Entscheidungen treffen, die die Informationen in der Anfrage verwenden, und anschließend Spleiße entsprechend binden. Sie können ähnliche Dinge mit kompilierten Spleißen tun, aber es erfordert eine Inversion der Kontrolle. Jetzt müssen Sie diese Art von dynamischer anforderungsbasierter Entscheidungsfindung innerhalb des Spleißes durchführen (was ein Monadetransformer um Ihre Handler-Monade ist, so dass Sie immer noch Zugriff auf Handlerfunktionen haben).

Ich empfehle kompilierte Spleiße als globale Ressourcen, die Sie Ihren Webdesignern zur Verfügung stellen, die sie auf jeder Seite verwenden können, wie sie es für richtig halten. Spleiße auf diese Weise zu betrachten, hat einige Vorteile. Erstens macht es sie orthogonaler und zusammensetzbarer als mit spezialisierten Spleißen, die mit heistLocal verbunden sind. Zweitens erleichtert es das Debugging, da Sie sich nie Gedanken darüber machen müssen, ob der Splice gebunden wurde oder nicht.

Die größte Schwierigkeit kompilierter Spleiße ist jedoch die Aufteilung von Ladezeit und Laufzeit und was das für Spleißfunktionen bedeutet. Wir sprechen ein wenig darüber im letzten Abschnitt unserer Wiki-Seite über migrating to Heist 0.10. Wir haben auch a longer discussion of the "why" dahinter.

Wir arbeiten auch noch an der Verbesserung der API für kompilierte Heist. Wir sind kurz davor, Heist 0.13 zu beenden, was die API erheblich vereinfacht und helfen sollte, die Dinge verständlicher zu machen. Der Code, der momentan in der new-api-Verzweigung von github ist, steht kurz vor der Veröffentlichung.

+0

OK. Also, würden Sie vorschlagen, für jetzt mit der interpretierten Variante zu bleiben? Nun, zumindest bis Sie die APIs aussortieren und stabilisieren. Ich kann immer noch nicht begreifen, um ehrlich zu sein ... Es hat noch nicht geklickt. Also würde ich alle Spleiße am Anfang in der makeSnaplet-Funktion binden und verarbeiten, oder? –

+0

Sie müssen nicht alles auf einmal tun, aber Sie müssen die addConfig-Funktion verwenden, um alle kompilierten Spleiße hinzuzufügen. Ob Sie wechseln, hängt davon ab, wie blutig Sie sein wollen. Ich sehe nicht voraus, dass sich der Zweig der neuen API viel mehr verändern wird. Das einzige, was auf meiner ToDo-Liste übrig bleibt, ist, ein oder zwei weitere Funktionen hinzuzufügen. Alles, was da ist, sollte ziemlich stabil sein. Ich werde keine konkrete Code-Antwort auf diese Frage geben, bis ich 0.13 veröffentlicht habe, aber wenn Sie mich im IRC treffen, kann ich Sie in die richtige Richtung weisen. – mightybyte

+0

Danke, mightybyte, ich werde auf einige Ihrer Beispiele nach der Version 0.13 warten. Zumindest die häufigsten Muster. Es wäre soooo nützlich, weil es gar nichts im Netz gibt. Ich bleibe bis jetzt bei der interpretierten Variante. –