00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 #include <basix/lisp_syntax.hpp>
00014 #include <basix/literal.hpp>
00015 #include <basix/compound.hpp>
00016 namespace mmx {
00017 
00018 static void
00019 as_lisp (string& out, const generic& g, bool quote_flag, bool fun_flag) {
00020   if (is<literal> (g)) {
00021     if (quote_flag && !fun_flag) out << quote (literal_to_string (g));
00022     else out << literal_to_string (g);
00023   }
00024   else if (is<compound> (g)) {
00025     nat i, n= N (g);
00026     out << "(";
00027     if (n>0) as_lisp (out, g[0], quote_flag, true);
00028     for (i=1; i<n; i++) {
00029       out << " ";
00030       as_lisp (out, g[i], quote_flag, false);
00031     }
00032     out << ")";
00033   }
00034   else {
00035     generic f= as_generic (flatten (g));
00036     as_lisp (out, f, quote_flag, fun_flag);
00037   }
00038 }
00039 
00040 string
00041 as_lisp (const generic& g, bool quote_flag) {
00042   string out;
00043   as_lisp (out, g, quote_flag, false);
00044   return out;
00045 }
00046 
00047 string
00048 flatten_as_lisp (const generic& g) {
00049   generic f= as_generic (flatten (g));
00050   return as_lisp (f);
00051 }
00052 
00053 }