GiNaC's numeric or symbolic expressions. E.g.
.BR fibonacci(24)/1104;
returns a GiNaC object of class
-.BR ex,
-, which in this case represents the numeric 42. Symbols are declared by
+.BR "ex" ,
+which in this case represents the numeric 42. Symbols are declared by
statements as
.nf
GiNaC> symbol x("x"), y("y"), z;
.RB ( { )
or a semicolon
.RB ( ; )
-is encountered.
+is encountered while there are no open braces. This implies that
+an input like
+.nf
+GiNaC> class A {
+ > }
+ > ;
+.fi
+is misinterpreted to be complete after the closing brace.
+Instead you have to write
+.nf
+GiNaC> class A {
+ > };
+.fi
.SS SPECIAL COMMANDS
+
+Lines starting with a dot mark special GiNaC-cint commands. Instead of
+.BR "\fB.cmd\fB"
+you can also write
+.BR "\fB//GiNaC-cint.cmd\fB"
+to be compatible with programs that will be compiled later.
+This is mostly useful for the
+.BR "\fB.function\fB"
+declaration.
+
+Lines starting with #! (for #!/path/ginaccint) are ignored.
+
+
.IP "\fB.cint\fR"
Switch to cint's interactive mode.
.IP "\fB.> [filename]\fB"
same as
-.BR "\fB.redirect [filename]\fB"
-.
+.BR "\fB.redirect [filename]\fB" .
.IP "\fBOut\fP\fInum\fP"
Returns the expression whose output was marked
void initialize(void);
void initialize_cint(void);
void restart(void);
+bool is_command(string const & command, string & preprocessed,
+ string const & comparevalue, bool substr=false);
bool readlines(istream * is, string & allcommands);
bool readfile(string const & filename, string & allcommands);
void savefile(string const & filename, string const & allcommands);
<< " .silent suppress 'OutXY = ...' output (variables are still" << endl
<< " accessible)" << endl
<< " .> [filename] same as .redirect [filename]" << endl << endl
-<< "Additionally you can exit GiNaC-cint with quit; exit; or bye;" << endl
+ << "Instead of '.cmd' you can also write '//GiNaC-cint.cmd' to be compatible with" << endl
+ << "programs that will be compiled later." << endl
+ << "Additionally you can exit GiNaC-cint with quit; exit; or bye;" << endl
<< endl;
}
}
}
+bool is_command(string const & command, string & preprocessed,
+ string const & comparevalue, bool substr)
+{
+ bool single_quote=false;
+ bool double_quote=false;
+ bool comment=false;
+ unsigned open_braces=0;
+ if ((preprocessed=="."+comparevalue)||
+ substr&&(preprocessed.substr(0,comparevalue.length()+1)==
+ "."+comparevalue)) {
+ return true;
+ }
+ if ((command=="//GiNaC-cint."+comparevalue+"\n")||
+ substr&&(command.substr(0,comparevalue.length()+13)==
+ "//GiNaC-cint."+comparevalue)) {
+ preprocessed = preprocess(command.substr(12).c_str(),comment,
+ single_quote,double_quote,open_braces);
+ return true;
+ }
+ return false;
+}
+
bool readlines(istream * is, string & allcommands)
{
char const * line;
if ((preprocessed=="quit;")||
(preprocessed=="exit;")||
(preprocessed=="bye;")||
- (preprocessed==".q")||
- (preprocessed==".quit")||
- (preprocessed==".exit")||
- (preprocessed==".bye")) {
+ (is_command(command,preprocessed,"quit"))||
+ (is_command(command,preprocessed,"exit"))||
+ (is_command(command,preprocessed,"bye"))||
+ (is_command(command,preprocessed,"q"))) {
quit = true;
- } else if (preprocessed==".function") {
+ } else if (is_command(command,preprocessed,"function")) {
cout << "next expression can be a function definition" << endl;
next_command_is_function=true;
- } else if (preprocessed==".cint") {
+ } else if (is_command(command,preprocessed,"cint")) {
cout << endl << "switching to cint interactive mode" << endl;
cout << "'h' for help, 'q' to quit, '{ statements }' or 'p [expression]' to evaluate" << endl;
G__pause();
cout << "back from cint" << endl;
- } else if (preprocessed==".help") {
+ } else if (is_command(command,preprocessed,"help")) {
helpmessage();
- } else if (preprocessed.substr(0,5)==".read") {
+ } else if (is_command(command,preprocessed,"read",true)) {
quit=readfile(preprocessed.substr(5),allcommands);
- } else if (preprocessed.substr(0,5)==".save") {
- command = "// "+command; // we do not want the .save command itself in saved files
+ } else if (is_command(command,preprocessed,"save",true)) {
+ command = "/* "+command+" */"; // we do not want the .save command itself in saved files
savefile(preprocessed.substr(5),allcommands);
- } else if (preprocessed==".restart") {
+ } else if (is_command(command,preprocessed,"restart")) {
restart();
- } else if (preprocessed.substr(0,9)==".redirect") {
+ } else if (is_command(command,preprocessed,"redirect",true)) {
redirect(preprocessed.substr(9));
- } else if (preprocessed.substr(0,2)==".>") {
+ } else if (is_command(command,preprocessed,">",true)) {
redirect(preprocessed.substr(2));
- } else if (preprocessed==".silent") {
+ } else if (is_command(command,preprocessed,"silent")) {
redirect("/dev/null");
/* test for more special commands
} else if (preprocessed==".xyz") {
cout << "special command (TBD): " << command << endl;
*/
+ } else if (command.substr(0,2)=="#!") {
+ // ignore lines which indicate that this file is executed as a script
} else {
// cout << "now processing: " << command << endl;
if (next_command_is_function) {