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