<\body> Il modo migliore per iniziare ad implementare in una nuova interfaccia, consiste nello studiare attentamente l'esempio del sistema di computer algebra , che è contenuto nella directory . Il file , il cui listato è disponibile alla fine di questa sezione, contiene un esempio molto semplice di programma che può essere interfacciato con . Per testare il programma è necessario compilarlo utilizzando il comando:\ <\verbatim> \ \ \ \ g++ mycas.cpp -o mycas e spostare il file binario in qualche punto del vostro path. All'avvio di è quindi necessario avere a disposizione la voce nel menu . Iniziamo a studiare, passo dopo passo, il codice di . In primo luogo osserviamo come ogni comunicazione avvenga utilizzando delle pipes e coinvolga standard input e output. Per permettere a di comprendere quando l'output del sistema ha terminato è necessario che ogni output sia incapsulato in blocchi, utilizzando tre speciali caratteri di controllo:\ <\verbatim> \ \ \ \ #define DATA_BEGIN \ \ ((char) 2) \ \ \ #define DATA_END \ \ \ \ ((char) 5) \ \ \ #define DATA_ESCAPE \ ((char) 27) Il carattere seguito da un qualsiasi altro carattere può essere usato per produrre , anche se è uno dei tre caratteri di controllo. Un'illustrazione di come utilizzare \ e è data dal seguente messaggio di inizio:\ <\verbatim> \ \ \ \ int \ \ \ main () { \ \ \ \ \ cout \\ DATA_BEGIN \\ "verbatim:"; \ \ \ \ \ cout \\ "------------------------------------------------------\\n"; \ \ \ \ \ cout \\ "Welcome to my test computer algebra system for TeXmacs\\n"; \ \ \ \ \ cout \\ "This software comes with no warranty whatsoever\\n"; \ \ \ \ \ cout \\ "(c) 2001 \ by Joris van der Hoeven\\n"; \ \ \ \ \ cout \\ "------------------------------------------------------\\n"; \ \ \ \ \ next_input (); \ \ \ \ \ cout \\ DATA_END; \ \ \ \ \ fflush (stdout); La prima linea del definisce il formato del carattere del messaggio di inizio che è di tipo ``verbatim''. La funzione , che viene richiamata al termine del messaggio di inizio, serve per stampare un prompt e se ne discuterà in dettaglio nel seguito. In conclusione chiude il blocco del messaggio di inizio e informa che è in attesa di un input. Non dimenticate alla fine di svuotare lo standard output, in modo che possa ricevere l'intero messaggio. Il ciclo principale inizia chiedendo l'input dallo standard input:\ <\verbatim> \ \ \ \ \ \ while (1) { \ \ \ \ \ \ \ char buffer[100]; \ \ \ \ \ \ \ cin \\ buffer; \ \ \ \ \ \ \ if (strcmp (buffer, "quit") == 0) break; L'output che viene restituito deve essere ancora una volta incluso in un blocco tipo -.\ <\verbatim> \ \ \ \ \ \ \ \ cout \\ DATA_BEGIN \\ "verbatim:"; \ \ \ \ \ \ \ cout \\ "You typed " \\ buffer \\ "\\n"; All'interno di tale blocco è possibile inviare ricorsivamente altri blocchi che possono essere specificati in formati diversi. Ad esempio, il seguente codice spedisce una formula in :\ <\verbatim> \ \ \ \ \ \ \ \ cout \\ "And now a LaTeX formula: "; \ \ \ \ \ \ \ cout \\ DATA_BEGIN \\ "latex:" \\ "$x^2+y^2=z^2$" \\ DATA_END; \ \ \ \ \ \ \ cout \\ "\\n"; Per alcuni scopi particolari può essere utile spedire direttamente l'output in formato utilizzando una rappresentazione :\ <\verbatim> \ \ \ \ \ \ \ \ cout \\ "And finally a fraction "; \ \ \ \ \ \ \ cout \\ DATA_BEGIN \\ "scheme:" \\ "(frac \\"a\\" \\"b\\")" \\ DATA_END; \ \ \ \ \ \ \ cout \\ ".\\n"; Per concludere, dobbiamo nuovamente inviare l'output e svuotare lo standard output:\ <\verbatim> \ \ \ \ \ \ \ \ next_input (); \ \ \ \ \ \ \ cout \\ DATA_END; \ \ \ \ \ \ \ fflush (stdout); \ \ \ \ \ } \ \ \ \ \ return 0; \ \ \ } Osserviamo che non è possibile inviare più di un blocco - alla volta. Appena il primo blocco - è stato ricevuto da , si assume che il sistema sia in attesa dell'input. Se si vuole inviare più di un blocco - tutti i blocchi da inviare devono essere inclusi in un blocco principale. Un ``canale'' speciale viene impiegato per inviare il prompt di input. I canali sono specificati come blocchi - speciali:\ <\verbatim> \ \ \ \ static int counter= 0; \ \ \ void \ \ \ next_input () { \ \ \ \ \ counter++; \ \ \ \ \ cout \\ DATA_BEGIN \\ "channel:prompt" \\ DATA_END; \ \ \ \ \ cout \\ "Input " \\ counter \\ "] "; \ \ \ } All'interno del canale di prompt è possibile utilizzare ancora blocchi - tuttavia in modo annidato. In questo modo è possibile ad esempio utilizzare come prompt una formula. Sono disponibili tre canali standard: <\description> .>canale predefinito per un output normale; .>per inviare prompt di input; .>per specificare un valore predefinito per l'input successivo. È possibile anche inviare output grafici in formato postscript. Immaginiamo ad esempio di avere una figura nella home directory. Allora inserendo le linee di codice: <\verbatim> \ \ \ \ \ \ \ \ cout \\ "A little picture:\\n"; \ \ \ \ \ \ \ cout \\ DATA_BEGIN \\ "ps:"; \ \ \ \ \ \ \ fflush (stdout); \ \ \ \ \ \ \ system ("cat $HOME/picture.ps"); \ \ \ \ \ \ \ cout \\ DATA_END; \ \ \ \ \ \ \ cout \\ "\\n"; nel punto appropriato del ciclo principale si otterrà la visualizzazione della figura nel centro dell'output. <\verbatim> #include \stdio.h\#include \stdlib.h\#include \string.h\#include \iostream.h\#define DATA_BEGIN \ \ ((char) 2)#define DATA_END \ \ \ \ ((char) 5)#define DATA_ESCAPE \ ((char) 27)static int counter= 0;voidnext_input () { \ counter++; \ cout \\ DATA_BEGIN \\ "channel:prompt" \\ DATA_END; \ cout \\ "Input " \\ counter \\ "] ";}intmain () { \ cout \\ DATA_BEGIN \\ "verbatim:"; \ cout \\ "------------------------------------------------------\\n"; \ cout \\ "Welcome to my test computer algebra system for TeXmacs\\n"; \ cout \\ "This software comes with no warranty whatsoever\\n"; \ cout \\ "(c) 2001 \ by Joris van der Hoeven\\n"; \ cout \\ "------------------------------------------------------\\n"; \ next_input (); \ cout \\ DATA_END; \ fflush (stdout); \ while (1) { \ \ \ char buffer[100]; \ \ \ cin \\ buffer; \ \ \ if (strcmp (buffer, "quit") == 0) break; \ \ \ cout \\ DATA_BEGIN \\ "verbatim:"; \ \ \ cout \\ "You typed " \\ buffer \\ "\\n"; \ \ \ cout \\ "And now a LaTeX formula: "; \ \ \ cout \\ DATA_BEGIN \\ "latex:" \\ "$x^2+y^2=z^2$" \\ DATA_END; \ \ \ cout \\ "\\n"; \ \ \ cout \\ "And finally a fraction "; \ \ \ cout \\ DATA_BEGIN \\ "scheme:" \\ "(frac \\"a\\" \\"b\\")" \\ DATA_END; \ \ \ cout \\ ".\\n"; \ \ \ next_input (); \ \ \ cout \\ DATA_END; \ \ \ fflush (stdout); \ } \ return 0;} <\initial> <\collection> <\references> <\collection> > |?>> |?>> > > |?>> <\auxiliary> <\collection> <\associate|idx> |Mycas>>|> |Testo>||Sessione>>|> <\associate|toc> |math font series||1Studying the source code step by step> |math font series||2Graphical output> |math font series||3The complete listing>