00001 
00002 
00003 
00004 
00005 
00006 
00007 #ifndef synaps_base_lisp_H
00008 #define synaps_base_lisp_H
00009 
00010 #include <iostream>
00011 #include <synaps/init.h>
00012 
00013 namespace std {template<class C> class complex;}
00014 
00015 __BEGIN_NAMESPACE_SYNAPS
00016 
00018 namespace lisp
00019 {
00021   class ostream {
00022   public:
00023     ostream(std::ostream& os): chl(os) { };
00024     std::ostream & chl;
00025 
00026   };
00027 }
00028 
00029 
00030 template<class OSTREAM, class C>
00031 OSTREAM & print_lisp(OSTREAM& os, const std::complex<C> & c) {
00032   os << "(+ ";
00033   print_lisp(os, c.real()); 
00034   if(c.imag() !=0) {
00035     os<<" (* ";
00036     print_lisp(os,c.imag());
00037     os<<" i)";
00038   }
00039   os <<")";
00040   return(os);
00041 }
00042 
00043 namespace lisp {
00044 
00046 
00047 
00048 
00049 
00050   inline ostream& operator <<(ostream& os, std::ostream& x(std::ostream &))
00051   {
00052     os.chl<<x; return os; 
00053   }
00054 
00055   template<class X>
00056   ostream& operator <<(ostream& os, const X& x) 
00057   { 
00058     print_lisp(os.chl,x); return os; 
00059   }
00060 }
00061 
00062 
00063 template<class OSTREAM, class X>
00064 OSTREAM& print_lisp(OSTREAM& os, const X& x) 
00065 { 
00066   os<<x; return os; 
00067 }
00068 
00069 
00070 namespace UPOLDAR 
00071 {
00072   template<class OSTREAM, class POL> 
00073   OSTREAM& lisp(OSTREAM& os, const POL&  P) 
00074   {
00075     print_lisp(os,"(+");
00076     int i, len= degree(P);
00077     for (i=len; i>=0; i--) {
00078       print_lisp(os," (* ");
00079       print_lisp(os,P[i]);
00080       print_lisp(os," (^ x ");
00081       print_lisp(os,i);
00082       print_lisp(os,"))");
00083     }
00084     print_lisp(os,")");
00085     return os;
00086   }
00087 }
00088 
00089 template<class C,class R> struct UPolDse;
00090 
00092 template<class OSTREAM, class C, class R>
00093 OSTREAM& print_lisp(OSTREAM& os, const UPolDse<C,R>& p) 
00094 {
00095   return UPOLDAR::lisp(os,p.rep());
00096 }
00097 
00098 __END_NAMESPACE_SYNAPS
00099 
00100 #endif //synaps_base_lisp_H