]> www.ginac.de Git - ginac.git/blobdiff - ginsh/ginsh_parser.yy
- introduced function void greeting(void).
[ginac.git] / ginsh / ginsh_parser.yy
index b8409ea0649f314f85c3f15afe346bf81fb0a71b..fb6edb05ed92d98526b70988e4025f801a927a4e 100644 (file)
@@ -3,7 +3,7 @@
  *  Input grammar definition for ginsh.
  *  This file must be processed with yacc/bison.
  *
- *  GiNaC Copyright (C) 1999 Johannes Gutenberg University Mainz, Germany
+ *  GiNaC Copyright (C) 1999-2000 Johannes Gutenberg University Mainz, Germany
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -86,7 +86,7 @@ static ex lst2matrix(const ex &l);
 %token T_NUMBER T_SYMBOL T_LITERAL T_DIGITS T_QUOTE T_QUOTE2 T_QUOTE3
 %token T_EQUAL T_NOTEQ T_LESSEQ T_GREATEREQ T_MATRIX_BEGIN T_MATRIX_END
 
-%token T_QUIT T_PRINT T_TIME T_XYZZY T_INVENTORY T_LOOK T_SCORE
+%token T_QUIT T_PRINT T_READ T_WRITE T_TIME T_XYZZY T_INVENTORY T_LOOK T_SCORE
 
 /* Operator precedence and associativity */
 %right '='
@@ -242,7 +242,6 @@ static void push(const ex &e)
  *  Built-in functions
  */
 
-static ex f_beta(const exprseq &e) {return gamma(e[0])*gamma(e[1])/gamma(e[0]+e[1]);}
 static ex f_denom(const exprseq &e) {return e[0].denom();}
 static ex f_eval1(const exprseq &e) {return e[0].eval();}
 static ex f_evalf1(const exprseq &e) {return e[0].evalf();}
@@ -253,7 +252,7 @@ static ex f_lsolve(const exprseq &e) {return lsolve(e[0], e[1]);}
 static ex f_nops(const exprseq &e) {return e[0].nops();}
 static ex f_normal1(const exprseq &e) {return e[0].normal();}
 static ex f_numer(const exprseq &e) {return e[0].numer();}
-static ex f_power(const exprseq &e) {return power(e[0], e[1]);}
+static ex f_pow(const exprseq &e) {return pow(e[0], e[1]);}
 static ex f_sqrt(const exprseq &e) {return sqrt(e[0]);}
 static ex f_subs2(const exprseq &e) {return e[0].subs(e[1]);}
 
@@ -299,9 +298,9 @@ static ex f_determinant(const exprseq &e)
 
 static ex f_diag(const exprseq &e)
 {
-       int dim = e.nops();
+       unsigned dim = e.nops();
        matrix &m = *new matrix(dim, dim);
-       for (int i=0; i<dim; i++)
+       for (unsigned i=0; i<dim; i++)
                m.set(i, i, e.op(i));
        return m;
 }
@@ -342,7 +341,7 @@ static ex f_evalf2(const exprseq &e)
 
 static ex f_has(const exprseq &e)
 {
-       return e[0].has(e[1]) ? exONE() : exZERO();
+       return e[0].has(e[1]) ? ex(1) : ex(0);
 }
 
 static ex f_inverse(const exprseq &e)
@@ -354,7 +353,7 @@ static ex f_inverse(const exprseq &e)
 static ex f_is(const exprseq &e)
 {
        CHECK_ARG(0, relational, is);
-       return (bool)ex_to_relational(e[0]) ? exONE() : exZERO();
+       return (bool)ex_to_relational(e[0]) ? ex(1) : ex(0);
 }
 
 static ex f_lcoeff(const exprseq &e)
@@ -379,7 +378,7 @@ static ex f_op(const exprseq &e)
 {
        CHECK_ARG(1, numeric, op);
        int n = ex_to_numeric(e[1]).to_int();
-       if (n < 0 || n >= e[0].nops())
+       if (n < 0 || n >= (int)e[0].nops())
                throw(std::out_of_range("second argument to op() is out of range"));
        return e[0].op(n);
 }
@@ -411,7 +410,7 @@ static ex f_rem(const exprseq &e)
 static ex f_series2(const exprseq &e)
 {
        CHECK_ARG(1, symbol, series);
-       return e[0].series(ex_to_symbol(e[1]), exZERO());
+       return e[0].series(ex_to_symbol(e[1]), ex(0));
 }
 
 static ex f_series3(const exprseq &e)
@@ -483,7 +482,6 @@ struct fcn_init {
 };
 
 static const fcn_init builtin_fcns[] = {
-       {"beta", fcn_desc(f_beta, 2)},
        {"charpoly", fcn_desc(f_charpoly, 2)},
        {"coeff", fcn_desc(f_coeff, 3)},
        {"collect", fcn_desc(f_collect, 2)},
@@ -513,7 +511,7 @@ static const fcn_init builtin_fcns[] = {
        {"normal", fcn_desc(f_normal2, 2)},
        {"numer", fcn_desc(f_numer, 1)},
        {"op", fcn_desc(f_op, 2)},
-       {"power", fcn_desc(f_power, 2)},
+       {"pow", fcn_desc(f_pow, 2)},
        {"prem", fcn_desc(f_prem, 3)},
        {"primpart", fcn_desc(f_primpart, 2)},
        {"quo", fcn_desc(f_quo, 3)},
@@ -554,10 +552,11 @@ static ex f_ginac_function(const exprseq &es, int serial)
 }
 
 // All registered GiNaC functions
-#ifndef NO_GINAC_NAMESPACE
-#else // ndef NO_GINAC_NAMESPACE
+#ifndef NO_NAMESPACE_GINAC
+void GiNaC::ginsh_get_ginac_functions(void)
+#else // ndef NO_NAMESPACE_GINAC
 void ginsh_get_ginac_functions(void)
-#endif // ndef NO_GINAC_NAMESPACE
+#endif // ndef NO_NAMESPACE_GINAC
 {
        vector<registered_function_info>::const_iterator i = function::registered_functions().begin(), end = function::registered_functions().end();
        unsigned serial = 0;
@@ -666,7 +665,7 @@ static ex lst2matrix(const ex &l)
                throw(std::logic_error("internal error: argument to lst2matrix() is not a list"));
 
        // Find number of rows and columns
-       int rows = l.nops(), cols = 0, i, j;
+       unsigned rows = l.nops(), cols = 0, i, j;
        for (i=0; i<rows; i++)
                if (l.op(i).nops() > cols)
                        cols = l.op(i).nops();
@@ -678,7 +677,7 @@ static ex lst2matrix(const ex &l)
                        if (l.op(i).nops() > j)
                                m.set(i, j, l.op(i).op(j));
                        else
-                               m.set(i, j, exZERO());
+                               m.set(i, j, ex(0));
        return m;
 }
 
@@ -714,30 +713,33 @@ static char **fcn_completion(char *text, int start, int end)
                // For shell commands, revert back to filename completion
                rl_completion_append_character = orig_completion_append_character;
                rl_basic_word_break_characters = orig_basic_word_break_characters;
-               return completion_matches(text, filename_completion_function);
+               return completion_matches(text, (CPFunction *)filename_completion_function);
        } else {
                // Otherwise, complete function names
                rl_completion_append_character = '(';
                rl_basic_word_break_characters = " \t\n\"#$%&'()*+,-./:;<=>?@[\\]^`{|}~";
-               return completion_matches(text, fcn_generator);
+               return completion_matches(text, (CPFunction *)fcn_generator);
        }
 }
 
+void greeting(void)
+{
+    cout << "ginsh - GiNaC Interactive Shell (" << PACKAGE << " V" << VERSION << ")" << endl;
+    cout << "  __,  _______  Copyright (C) 1999-2000 Johannes Gutenberg University Mainz,\n"
+         << " (__) *       | Germany.  This is free software with ABSOLUTELY NO WARRANTY.\n"
+         << "  ._) i N a C | You are welcome to redistribute it under certain conditions;\n"
+         << "<-------------' see the file COPYING for details." << endl;
+    cout << "Type ?? for a list of help topics." << endl;
+}
 
 /*
  *  Main program
  */
-
 int main(int argc, char **argv)
 {
        // Print banner in interactive mode
-       if (isatty(0)) {
-               cout << "ginsh - GiNaC Interactive Shell (" << PACKAGE << " " << VERSION << ")\n";
-               cout << "Copyright (C) 1999 Johannes Gutenberg Universitaet Mainz, Germany\n";
-               cout << "This is free software, and you are welcome to redistribute it\n";
-               cout << "under certain conditions; see the file COPYING for details.\n";
-               cout << "Type ?? for a list of help topics.\n";
-       }
+       if (isatty(0)) 
+               greeting();
 
        // Init function table
        insert_fcns(builtin_fcns);
@@ -758,19 +760,22 @@ int main(int argc, char **argv)
        insert_fcn_help("atan", "inverse tangent function");
        insert_fcn_help("atan2", "inverse tangent function with two arguments");
        insert_fcn_help("atanh", "inverse hyperbolic tangent function");
+       insert_fcn_help("beta", "beta function");
+       insert_fcn_help("binomial", "binomial function");
        insert_fcn_help("cos", "cosine function");
        insert_fcn_help("cosh", "hyperbolic cosine function");
+       insert_fcn_help("exp", "exponential function");
+       insert_fcn_help("factorial", "factorial function");
+       insert_fcn_help("gamma", "gamma function");
+       insert_fcn_help("log", "natural logarithm");
+       insert_fcn_help("psi", "psi function\npsi(x) is the digamma function, psi(n,x) the nth polygamma function");
        insert_fcn_help("sin", "sine function");
        insert_fcn_help("sinh", "hyperbolic sine function");
        insert_fcn_help("tan", "tangent function");
        insert_fcn_help("tanh", "hyperbolic tangent function");
-       insert_fcn_help("exp", "exponential function");
-       insert_fcn_help("log", "natural logarithm");
+       insert_fcn_help("zeta", "zeta function\nzeta(x) is Riemann's zeta function, zeta(n,x) its nth derivative");
        insert_fcn_help("Li2", "dilogarithm");
        insert_fcn_help("Li3", "trilogarithm");
-       insert_fcn_help("binomial", "binomial function");
-       insert_fcn_help("factorial", "factorial function");
-       insert_fcn_help("gamma", "gamma function");
        insert_fcn_help("Order", "order term function (for truncated power series)");
 
        // Init readline completer