2016-06-06 13 views
1

Ich versuche zu bestimmen, ob ich ChaiScript verwenden kann, aber bis jetzt bin ich sehr besorgt, dass es anscheinend keine Möglichkeit gibt, ein Skript zu kompilieren, das später verwendet werden kann. Dies wäre ein Problem, wenn ein Skript beispielsweise hunderte Male pro Sekunde aufgerufen werden muss.Kann ich ein ChaiScript-Skript einmal parsen/kompilieren und mehrmals aufrufen?

Alle Beispiele, die ich gefunden habe, beziehen sich auf eine C++ - Funktion namens eval, die ein ganzes Skript als Argument nimmt und es ausführt.

So ist es möglich, die Kompilierungs- und Ausführungsschritte zu trennen?

+0

Aus Experimenten sieht es so aus, als ob ich einfach eval verwende, um einen Verweis auf eine Funktion anzufordern, und dann kann ich diese Funktion einfach mehrmals direkt aufrufen. Ruft das den kompilierten Code direkt auf? – David

Antwort

2

Ihr Kommentar:

From experiments, it looks like I just use eval to request a reference to a function and then I can just invoke that function multiple times directly. Does that invoke the compiled code directly?

Dies ist der beste Weg, um es zu behandeln. Die eval wird den Code genau einmal analysieren. Wenn Sie ein std::function zu dem Ergebnis nehmen und dieses aufrufen, werden Sie in Ihrem Skript den effizientesten Weg aufrufen, den Sie können.

+0

Ja, es funktioniert --- leider, wenn es ein Problem mit dem Skript gibt, bietet der Ausnahme-Handling-Mechanismus, während eine Ausnahme abfangen, keine nützlichen Informationen über das Problem. – David

+0

Ich stehe korrigiert --- während Felder wie 'Details' und 'Dateiname' nicht ausgefüllt werden, liefert pretty_print() nützliche Informationen zurück. Leider muss ich die resultierende Zeichenkette auseinander ziehen, um an die Teile zu kommen, die ich brauche --- Ich möchte diesen pretty_print-Fehler nicht einfach dem Endbenutzer anzeigen. – David

+0

@David Sie haben tatsächlich Zugriff auf den gesamten Aufruf-Stack zum Zeitpunkt des Fehlers: https://github.com/ChaiScript/ChaiScript/blob/develop/include/chaiscript/language/chaiscript_common.hpp#L111, aber das ist jetzt weites Thema für diese Stackoverflow-Frage. Ich schlage vor, Sie verschieben die Diskussion auf http://discourse.chaiscript.com – lefticus