Ausgabe mit "Privat" Inhalt in Mathematica-Paket

8

Ich versuche, das folgende Implementierungsproblem in Mathematica 7.0 seit einigen Tagen zu lösen und ich verstehe nicht genau, was passiert, also hoffe ich, dass mir jemand ein paar Hinweise geben kann. Ich habe 3 Funktionen, die ich in Mathematica in einer Quelldatei mit der Erweiterung * .nb implementiert habe. Sie arbeiten in Ordnung mit allen Beispielen. Jetzt möchte ich diese Funktionen in 3 verschiedene Pakete setzen. Also habe ich drei verschiedene Pakete mit der Erweiterung. * M erstellt, in die ich alle gewünschten Mathematica-Funktionen eingetragen habe. Ein Beispiel im Paket "stereographic.m", das den Code enthält:

%Vor%

Um nun die Funktion zu testen, lade ich das Paket

%Vor%

alles ist in Ordnung. Aber wenn ich die Funktion zum Beispiel mit

teste %Vor%

Ich bekomme folgende Ausgabe:

%Vor%

Natürlich verstehe ich nicht, warum Private vor jeder lokalen Variable erscheint, die ich im Endergebnis zurückgegeben habe. Ich möchte diesen Private 'nicht in der berechneten Ausgabe haben. Irgendeine Idee oder bessere Erklärungen, die mir anzeigen könnten, warum dies geschieht?

Vielen Dank für Ihre Hilfe.

Beste Wünsche, Madalina

    
madalina 30.04.2010, 12:59
quelle

4 Antworten

7

Ihr Problem tritt häufig auf, wenn Sie symbolische Funktionen aus einem Paket zurückgeben, und wenn mir das passiert, sehe ich es so, als hätte ich beim Schreiben des Pakets etwas falsch gemacht. Wenn man alle diese Symbole mit Global voranstellt, wird das Problem "behoben", was einige der Ziele eines Pakets zunichte macht: Implementation Hiding. Da es den globalen Namespace mit Ihren Symbolen verunreinigt, müssen Sie auch sorgfältig darauf achten, wie Sie Ihren Code ausführen, wodurch der Zweck eines Pakets noch mehr zunichte gemacht wird. Ihrem Paket sollte es egal sein, wie die globale Umgebung aussieht. Wenn es etwas benötigt, kann es es entweder in BeginPackage oder mit Needs im privaten Teil des Pakets laden.

Stattdessen können Sie tun, was Funktionen wie Plot tun, akzeptieren Sie einen Symbol -Parameter wie folgt:

%Vor%

Intern werden symbolische Variablen wie normal referenziert, aber Ihre Funktion gibt jetzt einen symbolischen Ausdruck zurück, der alle globalen Symbole verwendet, die Sie verwenden möchten. Dies entkoppelt auch Ihre Wahl der Variablennamen mit den Implementierungsdetails Ihrer Funktion.

    
rcollyer 30.04.2010 15:40
quelle
2

Aus der Diskussion hier sieht es so aus, als würde die Zuweisung der Symbole innerhalb des Pakets zum globalen Kontext dazu führen, dass sie ohne das private Kontextpräfix ausgegeben werden.

Das heißt, alle Symbole, die Teil der Ausgabe sein könnten, könnten mit einem globalen Präfix deklariert werden, wie in diesem Beispiel:

%Vor%

In Ihrem Paket könnte es etwa so aussehen:

%Vor%

edit: Den globalen Variablen muss, wie oben erwähnt, das Präfix 'Global' zugewiesen werden, egal wo sie vorkommen.

    
codeulike 30.04.2010 13:12
quelle
1

Versuchen Sie, Begin["Private'"] in Begin["'Private'"] zu ändern.

    
ragfield 30.04.2010 16:01
quelle
1

Sie können formale Symbole anstelle von gewöhnlichen Symbolen verwenden, um Ihr Problem zu vermeiden.

>

Gleichzeitig ist die Verwendung formeller Symbole eine bequemere Möglichkeit, allgemeine Ausdrücke mit formalen Parametern auszugeben. Sie haben keine Werte und Werte für sie können nicht unbeabsichtigt festgelegt werden, da sie Protected sind.

Sie können die Palette "Sonderzeichen" für inter formale Symbole verwenden.

    
Alexey Popkov 16.06.2011 02:37
quelle

Tags und Links