Yacas unterstützt dynamisch ladbare Bibliotheken, mit denen die Funktionalität zur Laufzeit vergrößert werden kann. Mit einem entsprechenden Plugin wäre es z.B. möglich, spezielle Funktionen für numerische Berechnungen einzubinden.
Die Plugin-Schnittstelle ist zurzeit noch im experimentellen Stadium. Einige Beispiele für Plugins befinden sich im plugins/ Verzeichnis. Die Plugins müssen nach der Installation von Yacas gesondert compiliert werden. Das plugins/ Verzeichnis enthält eine README-Datei mit weiteren Hinweisen.
Neben dem Plugin-Mechanismus gibt es das ebenfalls noch in der Entwicklung befindliche Modul 'cstubgen', mit dem Plugins ohne größeren Aufwand erstellt werden können. Das 'cstubgen' Modul erzeugt eine c++ Datei, die sich compilieren und mit der Standardbibliothek linken lässt. Funktionen aus dem Plugin lassen sich dann so wie die eingebauten Yacas Funktionen aufrufen. Das plugins/ Verzeichnis enthält auch hierfür Beispiele (Dateien mit der Endung api.stub).
Zusätzlich zur c++ Datei generiert 'cstubgen' automatisch eine Dokumentationsdatei mit der Endung 'Beschreibung'.
Zurzeit arbeitet der Plugin-Mechanismus nur auf Betriebssystemen, die das ELF-Binärformat unterstützen, wie z.B. Linux.
Der folgende Abschnitt erfordert Kenntnisse in der C++ Programmierung.
In> DllLoad("./libopengl.so"); Out> True; |
Alle Argumente sind als Strings (eingeschlossen in Anführungszeichen) anzugeben.
Wird "fname2" nicht angegeben, dann wird hierfür "fname" angenommen.
Zurzeit werden die Funktionstypen "int", "double" und "void" unterstützt.
StubApiCFunction("void", "glVertex3d", {"double","double","double"}); |
Das Plugin muss eine Funktion der Form
static LispEnvironment* env = NULL; void GlutSetEnv(LispEnvironment& aEnv) { env = &aEnv; } |
StubApiCSetEnv("GlutSetEnv"); |
Fehlt das zweite Argument "freefunction", dann wird die Struktur mit einem Aufruf von free(...) aus dem Speicher entfernt, ansonsten wird die Funktion "freefunction" aufgerufen. Damit lassen sich evtl. erforderlich Operationen vor dem Entfernen der Struktur aus dem Speicher ausführen.
typedef struct SomeStruct { int a; int b; } SomeStruct; |
StubApiCStruct("SomeStruct*") |