Kurs  Cours

15. Packages

Die Gliederung dieses Kurses folgt in groben Zügen dem Buch von Nancy Blachman: A Practical Approach.... Hinweis: Kapitel 15 lesen!
 L'articulation de ce cours correspond à peu près à celle du livre de Nancy Blachman: A Practical Approach.... 
Indication: Lire le chapitre 15.

Run mit WIN+Mathematica Version 5.2
 Testé avec Mathematica version 5.2+WIN

WIR94/98/99/2000/2007 // Copyright Rolf Wirz

Problem: Externe Programme und Programmpackete schreiben.
Mathematica selbst ist in C geschrieben. Externe Programme, sogenannte Packages, sind aber in Mathematica selbst geschrieben. Bsp.: "Calculus`DSolveIntegrals`"
  Problème: Ecris les programmes extérieurs et des paquets de programmes. Mathematica est écrit en C. Les programmes extérieurs, les dits Packages, sont écrits dans Mathematica même. Ex.:
"Calculus`DSolveIntegrals`"

15.1. Wieso Packages? Wie zugreifen?
 Pourquoi des Packages? Comment les saisir?

15.1.1. Wieso Packages?
         Pourquoi des Packages?

Es ist klar, dass man häufig gebrauchte Funktionen oder Prozeduren etc. nicht immer wieder neu schreibt. Andere möchten auch gerne profitieren. So schreibt man eben externe Programme, die nach Bedarf zuladbar sind.
  Il est clair qu'on n'écrit pas chaque fois à nouveau des fonctions ou des procédures ets. fréquentes. Les autres aimeraient aussi en profiter. Ainsi on écrit des programmes extérieurs qu'on peut ajouter quand on en a besoin.

15.1.2. Wie greife ich auf ein mitgeliefertes Package?
          Comment saisir un Package livré

Die mitgelieferten Packages sieht man unter (Info, Open Function Browser, Packages) neu  Help, Add-ons, Standard Packages, .... . Nach dem Anklicken (Evaluate Template und dann Loaded Packages, Update Packages kann man im Browser das  geladene Package anklicken und sieht die darin enthaltenen Funktionen) neu COPY-PASTE.
  Les Packages livrés se trouvent sous  (Info, Open Function Browser, Packages) nouveau  Help, Add-ons, Standard Packages, .... . Après avoir marqué à la souris (Evaluate Template et ensuite Loaded Packages, Update Packages on peut marquer à la souris le Package chargé dans le Browser, on y voit les fonctions qui y sont contenues. ) nouveau COPY-PASTE.

Lade das nachfolgende Package und schaue im Browser nach, welche Funktionen darin enthalten sind (Browser: Loaded Packages, Update Packages, anklicken etc.) neu  Help, Add-ons, Standard Packages, .... 
  Charge le Package suivant et regarde dans le Browser quelles fonctions y sont contenues.   (Browser: Loaded Packages, Update Packages, marquer à la souris etc.) nouveau   Help, Add-ons, Standard Packages, ....

Needs["Statistics`DescriptiveStatistics`"]

?Mean

<<Algebra`FiniteFields`

?GF

15.2. Contexts
       Contextes

15.2.1. Das Wesen des Contexts
         L'essence du contexte

Ein Context ist vergleichbar mit einem Directory (Verzeichnis) oder einem Subdirectory (Folder). An die Namen der Variablen oder Symbolen wird dort der Contextname angehängt, so dass  es sich dann um lokale Objekte handelt. Das verhindert Namenkollision. Contexte können geschachtelt sein. Bisher haben wir immer im globalen Context gearbeitet. Probiere aus:
  Un contexte est comparable à un directoire (index) ou à un sous-directoire (Subdirectory, Folder). On y ajoute le nom du contexte aux noms des variables ou des symboles, de façon qu'il s'agisse ensuite d'objets locaux. Cela évite des collisions de noms. Les contextes peuvent être emboîtés. Jusqu'à présent nous avons toujours travaillé dans le contexte global. Essaie:

?$Path

$Path

15.2.2. Der Context-Pfad
 Le chemin ("path") du contexte

Studiere die Befehle:
  Etudie les ordres:

?Context

?$Context

?$ContextPath

?*Context*

?Dir*

?Directory

Probiere aus:    Essaie:

$ContextPath

Context[ParametricPlot]

Context[Integrate]

15.2.2. Context und Symbole
         Contexte et symboles

Beispiele
 Essaie

Studiere:    Etudie:

x = 2;
Remove[a];
{Context[x], Context[a], Context[Tuten]}

In welchem Context sind die geschaffenen Symbole?
  Dans quel contexte se trouvent les symboles crées?

Benzin = 50 Liter;
Auto`Benzin = 
"Interessiert den Umweltschutz. --
Interessant pour la protection naturelle.";

?Benzin

?*`Benzin

?Auto`Benzin

Wird der Context "Global" angegeben bei einer Abfrage?
Teste das aus:
  Est-ce que le contexte "Global"  est iniqué lors d'une interrogation? Fais un test:

`StudentError`Hoppla = 
"Das war wohl nicht so gemeint!
Ce n'est certainement pas l'intention!";

`StudentError`Hoppla

Global`StudentError`Hoppla

15.3. Context-Wechsel
       Changement de contexte

15.3.1. Allgemeines
         Généralités

Dies ist möglich mit der Variable $Context. Studiere:
  Cela est possible avec la variable $Context. Etudie:

Benzin

$Context = "Auto`"

Benzin

$Context

$Context = "Global`"

Benzin

15.3.2. Der Befehl "Begin"
         L'ordre "Begin"

Mit den Befehlen Begin, BeginPackage, End, EndPackage wird der Context gewechselt. Studiere:
  Par les ordres Begin, BeginPackage, End, EndPackage on change de  contexte. Etudie:

?Begin

?BeginPackage

?End

?EndPackage

Probiere aus:    Essaie:

$Context

$ContextPath

Begin["Versuch`"]

$Context

$ContextPath

Nun führen wir eine Variable ein:
  Nous introduisons une variable:

dumm = "frech und beschränkt -- 
		mal poli et borné"

Context[dumm]

End[ ]

$Context

$ContextPath

?dumm

?Versuch`dumm

In welchem Context sind wir jetzt und wie ist der Pfad gesetzt?
  Dans quel contexte somme-nous maintenant et comment le chemin est-il posé?

15.3.3. Der Befehl "Begin"
         L'ordre "Begin"

Probiere aus:    Essaie:

BeginPackage["HalloWach`"]

$Context

$ContextPath

Was ist der Unterschied zwischen Begin und BeginPackage?
Probiere jetzt früher definierte Variablen aus:
  Quelle est la différence entre Begin et BeginPackage?
Essaie maintenant des variables définies il y a un certain temps:

?Benzin

?Global`Benzin

dumm

dumm = 
"blöd und lieb zur Hälfte und beides 
zusammen -- idiot et aimable à moitié
ou toutes les deux ensembles"

EndPackage[]

$Context

$ContextPath

dumm

Context[dumm]

{Versuch`dumm, dumm}

15.4. Zum Laden von Packages
       Pour charger des Packages

15.4.1. Befehle
         Ordres

Zur Verfügung stehen die Befehle <<, Get und Needs. 
Studiere die Befehle:
  Les ordres suivants sont à disposition: <<, Get et Needs. 
Etudie les ordres:

?<<

?Get

?Needs

?$Path

$Path

Hinweis: Die Variable $Path wird im File init.m gesetzt! (C:\Programme\Wolfram Research\Mathematica\3.0\Configuration\Kernel.) Dieses File kann von einem selbst modifiziert werden. (NeXT: Es soll sich bei privaten Installationen im eigenen Root befinden.) Beim Start von Mathematica wird es gelesen. 
  Retenir: La variable $Path est mise dans le fichier init.m! (C:\Programme\Wolfram Research\Mathematica\3.0\Configuration\Kernel.) On peut modifier soi-même ce fichier. (NeXT: Il doit se trouver dans le propre Root quant il s'agit d'installations privées.) Il est lu quand on démarre Mathematica.

15.4.2. Laden mit Get resp. <<
         Charger avec Get resp. <<

Bemerkung: "Packages" befindet sich in $Path! Führe die folgenden Befehle nacheinander aus:
 Remarque: "Packages" se trouve dans $Path! Exécute les ordres suivants l'un après l'autre:

$Path

?Helix

Remove[Helix]

<< Graphics/Shapes.m;
?Helix

$ContextPath

<< Graphics`Shapes`;
?Helix

<< Graphics/Shapes.m;
?Helix

Needs["Graphics`Shapes`"]

$ContextPath

15.4.3. Laden mit Needs
         Charger avec Needs

Was ist der Unterschied gewesen zwischen Get und Needs? 
  Quelle était la différence entre Get et Needs?

Get["Graphics`Shapes`"]

Needs["Graphics`Shapes`"]

Versuche:    Essaie:

BeginPackage["Graphics`Shapes`", 
"Geometry`Rotations`"]

$ContextPath

15.4.3. Wie sieht man den Inhalt eines Packages (Funktionen)?
  Comment voit-on le contenu d'un Package (fonctions?)

Versuche:    Essaie:

?Rotate2D

?Geometry`Rotations`Rotate2D

?Graphics`Shapes`Helix (*Old Vers.*)

?Geometry`Rotations`*

?Graphics`Shapes`*     (*Old Vers.*)

?Geometry`*`*

Achtung: private bedeutet "zugriffgeschützt"! Es wird keine spezifische Information abgegeben. Beispiel:
  Attention: Privé signifie "ne peut pas être saisi"! On ne donne pas d'information spécifique. Exemple:

?Geometry`Rotations`Private`phi

?Geometry`Rotations`Private`*

?Geometry`Rotations`Private`vec

Welche Packages sind da? Wir suchen z.B. ein Objekt, in dessen Namen hinter dem "`" ein "a" vorkommt:
  Quels Packages y a-t-il? Nous cherchons p.ex. un objet, dans le nom duquel il y a un "`" suivi d'un "a" :

?*`a*

15.5. Der Package-Stil
       Le style Package

Studiere die folgenden Beispiele konsequent durch!
  Fais une étudie approfondie des exemples suivants!

Hier zwei Beispiele aus der Mathematica-Bibliothek
 Voici deux exemples de la bibliothèque de Mathematica:

Beispiel 1 (Kopie aus der old Library, etwas kommentiert)
 Exemple 1 (Copie de la old Librery, un peu commentée)

(*********************************************************************

        Adapted from
        Roman E. Maeder: Programming in Mathematica,
        Second Edition, Addison-Wesley, 1991.
Wichtig: Gute Dokumentation!   Important: Bonne documentation!  
   
 *********************************************************************)


BeginPackage["Graphics`ArgColors`"]
(* Wichtig: $Context und $ContextPath wechseln! 			    *)
(* Important: Changer $Context et $ContextPath ! 			    *)
(* Wichtig: Die hier definierten Funktionen, z.B. ArgColor, sind 	    *)
(*          nach aussen sichtbar. Die Symbole dafür werden in diesem 	*)
(*          Context kreiert. 						*)
(*  Important: Les fonctions définies ici, p.ex. ArgColor, sont 	    *)
(*          visibles à l'extérieur. Les symboles en sont crées dans ce 	*)
(*          contexte.          						*)
   
ArgColor::usage = "ArgColor[z] gives a color value whose hue is proportional
	to the argument of the complex number z."
ArgShade::usage = "ArgShade[z] gives a gray level proportional
	to the argument of the complex number z."

ColorCircle::usage = "ColorCircle[r, (light:1)] gives a color value whose hue
	is proportional to r (mod 2Pi) with lightness light."
(* Wichtig: usage-Statement für alle aussen sichtbaren Funktionen *)
(*  Important: usage-Statement visibles pour toutes les fonctions *)
(*    visibles à l'extérieur. *)

Begin["`Private`"]
(* Wichtig: $Context wechselt auf `Private`,  			 *)
(*  Important: $Context devient `Private`,  			 *)
(*          $ContextPath bleibt  reste.  *)
(* Wichtig: Hier neu definierte Funktionen sind aussen unsichtbar! *)
(*  Important: Les fonctions définies ici nouvellement ne sont pas*)
(*    visibles à l'extérieur! *)

HelperFunction[z_] := Print["Mich siehst Du von aussen nicht", z]

ArgColor[z_] := RGBColor[1, 1, 1] /; z == 0.0

ArgColor[z_] := ColorCircle[ Arg[z] ] /; NumberQ[N[arg]]

ArgShade[z_] := GrayLevel[1] /; z == 0.0

ArgShade[z_] := GrayLevel[N[(Pi + Arg[z])/(2Pi)] ] /; NumberQ[N[Arg[z]]]

ColorCircle[arg_, light_:1.0] := Hue[ N[arg/2/Pi], 1, light] /; NumberQ[N[arg]]

End[ ]
(* Wichtig: $Context wechselt zurück 			 *)
(*          auf den Wert vor dem Aufruf von `Private`              *)
(*   Important: $Context reprend la forme d'origine 	 *)
(*          sur la valeur d'avant l'apppel de  `Private`              *)

Protect[ArgColor, ArgShade, ColorCircle]
(* Wichtig: Die aussen sichtbaren Funktionen werden geschützt.     *)
(*  Important: Les fonctions visibles à l'extérieur sont protégées.     *)

EndPackage[ ]
(* Wichtig: $Context wird zurückgewechselt auf den alten Wert.     *)
(* Wichtig: Zu $ContextPath wird der Name 			  *)
(*          "Graphics`ArgColors`" hinzugefügt.       			  *)
(*  Important: $Context reprend la valeur d'origine.                          *)
(*  Important: On ajoute à $ContextPath le nom 			  *)
(*          "Graphics`ArgColors`" .		     			  *)

(*********************************************************************

Adapted from
Roman E. Maeder: Programming in Mathematica,
Second Edition, Addison-Wesley, 1991.
(Obige Kopie aus der Library etwas abgeändert, 
 so dass sie auf NeXT... lauffähig ist.
  La copie de Libary ci cessus un peu changée,
  de façon qu'elle puisse fonctionner sur NeXT
  .....)

 *********************************************************************)

BeginPackage["Test`"];

argColor1::usage = 
"ArgColor[z] gives a color value whose hue is 
    proportional;
	to the argument of the complex number z."
argShade1::usage = 
"ArgShade[z] gives a gray level proportional
	to the argument of the complex number z.";

colorCircle1::usage = 
"ColorCircle[r, (light:1)] gives a color value 
     whose hue is proportional to r (mod 2Pi)
     with lightness light.";

Begin["`Private`"];

argColor1[z_] := RGBColor[1, 1, 1] /; 
				z == 0.0  ;

argColor1[z_] := ColorCircle[ Arg[z] ] /; 
				NumberQ[N[Arg]]  ;

argShade1[z_] := GrayLevel[1] /; z == 0.0
argShade1[z_] := GrayLevel[N[(Pi + 
		Arg[z])/(2Pi)] ] /; 
        NumberQ[N[Arg[z]]]   ;

colorCircle1[arg_, light_:1.0] := 
		Hue[ N[arg/2/Pi], 1, light] /; 
        NumberQ[N[Arg]]   ;

End[];

Protect[argColor1, argShade1, colorCircle1]

EndPackage[];

(*********************************************************************

Adapted from
Roman E. Maeder: Programming in Mathematica,
Second Edition, Addison-Wesley, 1991.
(Obige Kopie aus der Library etwas abgeändert, 
 so dass sie auf NeXT.. lauffähig ist, jetzt mit
 Abfrage der Context-Variablen und des Context-
 Pfades.
  La copie de Libary ci cessus un peu changée,
  de façon qu'elle puisse fonctionner sur NeXT
  .., maintenant avec interrogation (appel) des
  variables du contexte et du chemin du 
  contexte.)

 *********************************************************************)

Print["1. Abfrage: $ContextPath = ",  
	$ContextPath, "	$Context = ", $Context]; 

BeginPackage["Test`"];
Print["2. Abfrage: $ContextPath = ",  
	$ContextPath, "	$Context = ", $Context]; 

argColor1::usage = 
"ArgColor[z] gives a color value whose hue is 
  	proportional;
	to the argument of the complex number z."
argShade1::usage = 
"ArgShade[z] gives a gray level proportional
	to the argument of the complex number z.";

colorCircle1::usage = "ColorCircle[r, 
	(light:1)] gives a color value 
     whose hue is proportional to r (mod 2Pi) 
     with lightness light.";

Begin["`Private`"];
Print["3. Abfrage: $ContextPath = ",  
	$ContextPath, "	$Context = ", $Context]; 

argColor1[z_] := RGBColor[1, 1, 1] /; 
		z == 0.0  ;

argColor1[z_] := ColorCircle[ Arg[z] ] /; 
		NumberQ[N[Arg]]  ;

argShade1[z_] := GrayLevel[1] /; 
		z == 0.0
argShade1[z_] := GrayLevel[N[(Pi + 
		Arg[z])/(2Pi)] ] /; 
        NumberQ[N[Arg[z]]]   ;

colorCircle1[arg_, light_:1.0] := 
		Hue[ N[arg/2/Pi], 1, light] /;
        NumberQ[N[Arg]]   ;

End[];
Print["4. Abfrage: $ContextPath = ",  
	$ContextPath, "	$Context = ", $Context]; 

Protect[argColor1, argShade1, colorCircle1]

EndPackage[];
Print["5. Abfrage: $ContextPath = ",  
	$ContextPath, "	$Context = ", $Context];

Beispiel 2 (Kopie aus der Library, ohne Kommentar)
 Exemple 2 (Copie de Library, sans commentaire)

(*********************************************************************

	Copyright 1991 by Roman E. Maeder
	
	Adapted from
	Roman E. Maeder: Programming in Mathematica,
	Second Edition, Addison-Wesley, 1991.

	Permission is hereby granted to make copies of this file for
	any purpose other than direct profit, or as part of a
	commercial product, provided this copyright notice is left
	intact.  Sale, other than for the cost of media, is prohibited.
	
	Permission is hereby granted to reproduce part or all of
	this file, provided that the source is acknowledged.

 *********************************************************************)

	(* Enclosed with Mathematica by permission *)


BeginPackage["Examples`Collatz`"]

Collatz::usage =
	"Collatz[n] gives a list of the iterates in the 3n+1 problem,
	starting from n. The conjecture is that this sequence always
	terminates."

StoppingTime::usage = "StoppingTime[n] finds the total stopping time
	of the integer n. This is the length of the Collatz sequence
	before hitting 1."

FindMaxima::usage = "FindMaxima[from] reports successive maxima of the
	total stopping time starting the search with the integer from."

Begin["`Private`"]

Collatz[n_Integer] := AppendCollatz[{}, n]

AppendCollatz[sofar_, 1] := Flatten[{sofar, 1}]

AppendCollatz[sofar_, n_Integer] :=
	AppendCollatz[{sofar, n}, 3 n + 1]	/; OddQ[n]

AppendCollatz[sofar_, n_Integer] :=
	AppendCollatz[{sofar, n}, n / 2]	/; EvenQ[n] && n != 0

StoppingTime[n_Integer?Positive] :=
	Module[{i=1, m=n}, While[m != 1, m = If[OddQ[m], 3m+1, m/2]; i++];i ]

FindMaxima[low_] :=
	Module[{m=0, n=0, i=low, j},
		While[ True,
			j = StoppingTime[i];
			If[j > m, m = j; n = i;
			          Print["StoppingTime[", n, "] = ", m] ];
			i++;
			If[ Mod[i, 100] == 0, Print["i = ", i] ]
		]
	]

End[]

Protect[ Collatz, StoppingTime, FindMaxima ]

EndPackage[ ]

15.6. Namenskonflikte 
       Conflits de noms

15.6.1. Beispiel eines Konflikts
         Exemple d'un conflit

Mehrfach verwendete Namen in verschiedenen Umgebungen
 Noms utilisés de plusieurs façons dans des environs différents.

Studiere die folgende Abfolge:
  Etudier la suite suivante:

LaplaceTransform[(1+4t+5t^2) Exp[-3t], t, s]

Die gerufene Funktion war noch unbekannt. Das Symbol LaplaceTransform ist aber jetzt kreiert worden, allerdings ohne konkreten Inhalt.
  La fonction appelée était encore inconnue. Le symbole LaplaceTransform a été crée maintenant, cependant sans contenu concret.

?LaplaceTransform

Laden des Packages:
  Charger le Package:

Needs["Calculus`LaplaceTransform`"]

?LaplaceTransform

<<Calculus`FourierTransform`

NFourierTransform[Exp[-t^2]/(1 + Abs[t]), t, 1]

Die in Global` vorher kreierte Funktion überschattet immer noch die in einem "Unter-Context" zugeladene Funktion mit demselben Namen.
  La fonction créée auparavant dans Global` recouvre encore la fonction du même nom qui se trouve dans un sous-contexte.

Remove[FourierTransform]

Die in Global` existierende Funktion wird eliminiert. Die darunter liegende zeigt sich jetzt.
 La fonction existant dans un Global` est élininée. Celle qui se trouve dessous devient visible.

?FourierTransform

Nun kann man sie auch verwenden:
  Maintenant on peut aussi l'utiliser:

FourierTransform[(1+4t+5t^2), t, ω]

Was gibt es sonst noch im geladenen Package?
  Qu'y a-t-il encore dans le Package chargé?

?Calculus`FourierTransform`*

15.6.2. Der empfohlene Stil
         Le style conseillé

Im Folgenden wird ein Prototyp eines Packages demonstriert, das ursprünglich von Henry Cejtin und Theo Gray stammen soll:
  Dans ce qui suit on démontre un prototype d'un Package qui a été créé, soit-disant, par Henry Cejtin et Theo Gray.

\(\(\(\ \)\( (*\ 
      OpenWrite["C:\work\MathematicaData\AAKurs15.m"]; 

      WriteString["C:\work\MathematicaData\AAKurs15.m", \ "
", 
"Du sollst das Package von Hand in das File", 
"
", "AAKurs15.m kopieren."
\ ]; \ \ \  (*\ \(End\ WriteString\ \ etc . \ \(-\ 
                  continued\)\  ... \)\(.\)\ *) \ \ *) \)\(
\)\(
\)\(\(OpenWrite["AAKurs15.m"];\)

    \(\(\(WriteString["AAKurs15.m", \ "
", 
"Du sollst das Package von Hand in das File", 
"
", "AAKurs15.m kopieren."
\ ]\) \)\(;\)\(\ \ \ \)\( (*\ \(End\ WriteString\ \ etc . \ \(-\ 
                continued\)\  ... \)\(.\)\ *) \)\)\)\)\)

" " >> AAKurs15.m;

OpenWrite[
"AAKurs15.m"];
WriteString[
"AAKurs15.m",
 "\n",
"!!!!!! 
Du sollst das Package von Hand in das File",
"\n","AAKurs15.m kopieren."
"Il faut copier le Package à la main dans le 
 File", "\n","AAKurs15.m kopieren." ];   
(* End WriteString   *)
 
 Close["AAKurs15.m"];


(*
 * AAKurs15.m
 * 
 * This package demonstrates the recommended
 * package style.
 *
 *)

(*
 * Prepend the context ProtoNotebook` to 
 * $ContextPath.
 * Then Needs will be able to determine when 
 * the package 
 * has been loaded.
 *)
BeginPackage["AAKurs15`"];
EndPackage[];

(*
 * Now the usage statements.
 *)
ExamplePlot::usage = "ExamplePlot[n,m] draws \
	n starbursts and m spirals. \
	ExamplePlot[n] draws n starbursts and 
	no spirals.";
	
SamplePlot::usage = 
	"SamplePlot is Vaporware. It \
    does nothing.";
    
(*
 * Now the global objects.
 *)
ExamplePlot;
SamplePlot;
    
(*
 * Now the private context. The objects here 
 * are not \
 * intended to be accessed by the user. 
 *)
 Begin["AAKurs15`Private`"];

(*
 * Local objects.
 *)
`starBurst;
`spiral;

(*
 * Define starBurst and spiral.
 *)
 starBurst[center_, radius_, n_] :=
    Block[
        { `r  },
        Table[
            Line[{center,
                  center + radius {Cos[r], 
                  Sin[r]}
                }],
                {r, 0, 2Pi - 2Pi/n, 2Pi/n}
             ]
          ];
  
spiral[center_, radius_, loops_] :=
    Block[
        { `t  },
        Line[
            Table[center +
                  radius t {Cos[t], Sin[t]}/(2Pi
                  					 loops),
                  {t, 0, 2Pi loops, 2Pi/30}
                 ]
             ]
          ];

ExamplePlot[stars_] :=
    Show[
        Graphics[
            Table[
                starBurst[
                    4 {Random[], Random[]},
                    0.3 + Random[],
                    20
                         ],
                         {stars}
                  ]
                ],
                AspectRatio -> Automatic
          ];

ExamplePlot[stars_, spins_] :=
    Show[
        Graphics[{
            Table[
                starBurst[
                    4 {Random[], Random[]},
                    0.3 + Random[],
                    20
                         ],
                         {stars}
                  ],
             Table[
                spiral[
                    4 {Random[], Random[]},
                    0.3 + Random[],
                    Random[Integer, {2, 5}]
                         ],
                         {spins}
                   ]
                }],
                AspectRatio -> Automatic
          ];
          
(*
 * Protect now the function and lock the private
 * functions. 
 *)
 Protect[ExamplePlot, SamplePlot];
 Append[Attributes[ExamplePlot], Locked];
 Append[Attributes[SamplePlot], Locked];
 
 End[];

Schaue ins File    Regarde le fichier
C:\Programme\Wolfram Research\Mathematica\3.0\AAKurs15.nb !!!!!!!!!!!!

Needs["AAKurs15`"]

Needs["C:\\work\\MathematicaData\\AAKurs15.m"]

<< AAKurs15.m

?AA*

$Path

Needs["AAKurs15`"]

?SamplePlot

?ExamplePlot

ExamplePlot[4, 3]

ExamplePlot[5]

SamplePlot[5]

15.6.3. Einlesen eines externen Files in einen andern Context
 Lire un fichier extérieur et le mettre dans un autre contexte

Im folgenden Beispiel wird gezeigt, wie ProtoNotbook` in den Context PlottingExamples` eingelesen wird. Probiere die verschiedenen Situationen durch:
 Dans l'exemple suivant on montre comme ProtoNotbook` est mis dans  
le contexte PlottingExamples`. Essaie les différentes situations:

?SymbolicSum

Remove["Global`*"]

End[]

?*SamplePlot

$Context

Begin["PlottingExamples`"];
$Context

$ContextPath

?SymbolicSum

<<Calculus`VectorAnalysis`

?JacobianMatrix

?*SamplePlot

Needs["Calculus`VectorAnalysis`"]

?Calculus`VectorAnalysis`*

$Context

$ContextPath

a = 1

a

End[]

a

$Context

$ContextPath

?Calculus`VectorAnalysis`*

15.6.4. Notebooks
         Notebooks

Dieses File hier ist ein Notebook. In solchen Notebooks oder allgemein bei der interaktiven Benützung von Mathematica mit einem Front-End, das mit Zellen arbeitet, können Probleme mit dem Context auftreten, wenn man nicht aufpasst. Studiere das folgende Beispiel:
  Le fichier est un Notebook. Dans des Notebooks de ce genre ou plus généralement quand on utilise interactivement Mathematica avec un Front-End qui travaille avec des cellules, il peut y avoir des problèmes avec le contexte quand on ne fait pas attention. Etudie l'exemple suivant:

Remove["Global`@*"]

esel = "Dummes menschliches Individuum, 
Anwesende immer ausgeschlosen. --- Etre humain 
bête, personnes présents exclus."

Context[esel]

BeginPackage["Zoologie"];
esel = "Säugetier im Dienste des Menschen.
       --- Mammifèr au service des hommes";

esel

Context[esel]

Global`esel

Zoologie`esel

EndPackage[]

esel

Wo ist der eingangs eingegebene "Wert" der Variablen "esel" geblieben?
  Où a disparu la "valeur" de la variable "esel" entrée au début?

"Putzmaschine" einsetzen
 Employer la "machine de nettoyage"

(* Old Form: Remove["Global`@*"] *)

Remove["Global`*"]