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 }