| 1897 | } |
| 1898 | |
| 1899 | static public void print(Object x, Writer w) throws IOException{ |
| 1900 | //call multimethod |
| 1901 | if(PRINT_INITIALIZED.isBound() && RT.booleanCast(PRINT_INITIALIZED.deref())) |
| 1902 | PR_ON.invoke(x, w); |
| 1903 | //* |
| 1904 | else { |
| 1905 | boolean readably = booleanCast(PRINT_READABLY.deref()); |
| 1906 | if(x instanceof Obj) { |
| 1907 | Obj o = (Obj) x; |
| 1908 | if(RT.count(o.meta()) > 0 && |
| 1909 | ((readably && booleanCast(PRINT_META.deref())) |
| 1910 | || booleanCast(PRINT_DUP.deref()))) { |
| 1911 | IPersistentMap meta = o.meta(); |
| 1912 | w.write("#^"); |
| 1913 | if(meta.count() == 1 && meta.containsKey(TAG_KEY)) |
| 1914 | print(meta.valAt(TAG_KEY), w); |
| 1915 | else |
| 1916 | print(meta, w); |
| 1917 | w.write(' '); |
| 1918 | } |
| 1919 | } |
| 1920 | if(x == null) |
| 1921 | w.write("nil"); |
| 1922 | else if(x instanceof ISeq || x instanceof IPersistentList) { |
| 1923 | w.write('('); |
| 1924 | printInnerSeq(seq(x), w); |
| 1925 | w.write(')'); |
| 1926 | } |
| 1927 | else if(x instanceof String) { |
| 1928 | String s = (String) x; |
| 1929 | if(!readably) |
| 1930 | w.write(s); |
| 1931 | else { |
| 1932 | w.write('"'); |
| 1933 | //w.write(x.toString()); |
| 1934 | for(int i = 0; i < s.length(); i++) { |
| 1935 | char c = s.charAt(i); |
| 1936 | switch(c) { |
| 1937 | case '\n': |
| 1938 | w.write("\\n"); |
| 1939 | break; |
| 1940 | case '\t': |
| 1941 | w.write("\\t"); |
| 1942 | break; |
| 1943 | case '\r': |
| 1944 | w.write("\\r"); |
| 1945 | break; |
| 1946 | case '"': |
| 1947 | w.write("\\\""); |
| 1948 | break; |
| 1949 | case '\\': |
| 1950 | w.write("\\\\"); |
| 1951 | break; |
| 1952 | case '\f': |
| 1953 | w.write("\\f"); |
| 1954 | break; |
| 1955 | case '\b': |
| 1956 | w.write("\\b"); |