Ho un grafico ciclico che ho creato utilizzando dosync
e ref-set
. Quando passo questo a println
ottengo un java.lang.StackOverflowError
come mi aspetterei, perché è effettivamente cercando di stampare una struttura infinitamente nidificata.Come sovrascrivere il comportamento di println per i tipi di riferimento
ho scoperto che se lo faccio (str my-ref)
crea qualcosa che assomiglia [email protected]
e in realtà non tentare di attraversare la struttura e stampare tutto fuori, quindi questo risolve il problema nel senso immediato, ma aiuta solo quando sono molto attento a quello che sto stampando sullo schermo. Mi piacerebbe essere in grado di chiamare (println my-graph)
come stampare il ref
come un tipo di testo personalizzato (che potrebbe coinvolgere lo str
) e gli altri elementi non di riferimento normalmente.
Attualmente ho una funzione di stampa personalizzata che stampa ogni elemento della struttura da solo e ignora completamente la stampa di ref
. (Si scopre che guardare a [email protected]
in realtà non è molto utile). Questo è scomodo da usare e ostacola enormemente l'ispezione casuale di cose al REPL e impedisce anche all'ispettore Emacs di guardare cose mentre sono in una cosa di debug swank.core/break
.
Un dettaglio è il ref
in realtà è un valore in un defstruct
che contiene anche alcune altre cose che sto cercando di stampare normalmente.
Quindi mi chiedo quale strada dovrei andare giù. Vedo queste opzioni:
- Capire
extend-type
e applicare il protocolloCharSequence
alla mia struttura eddefstruct
in modo che quando si incontra unref
funziona correttamente. Ciò richiede ancora un'ispezione field-by-field della struttura e un caso speciale quando si tratta diref
, ma almeno localizza il problema nella struct e non in tutto ciò che contiene la struct. - Capire come ignorare il protocollo
CharSequence
quando si incontra unoref
. Ciò consente un comportamento ancora più localizzato e mi consente di visualizzare un riferimento ciclico al REPL anche quando non si trova all'interno di una struttura. Questa è la mia opzione preferita. - Capire come fare qualcosa con
toString
che credo sia chiamato ad un certo livello quando faccioprintln
. Sono molto ignorante su questa opzione. Abbastanza ignorante anche sugli altri, ma ho lettoJoy of Clojure
e ora sono tutto ispirato.
Allo stesso modo questa soluzione dovrebbe valere per print
e pprint
e qualsiasi altra cosa che normalmente barf quando si tenta di stampare un ref ciclico. Quale strategia dovrei assumere?
grazie mille per qualsiasi input.
fyi, l'output di '' (str my-ref) '' è quasi certamente il risultato della chiamata di '' java.lang.Object # toString() '' come descritto qui: http://docs.oracle. com/javase/7/docs/api/java/lang/Object.html # toString% 28% 29 – sw1nn
Si noti che 'defstruct' è stato sostituito da' defrecord'. Inoltre, 'defstruct' non crea un tipo reale, quindi non può partecipare ai protocolli. – raek
Mi rendo conto ora che stavo già usando 'defrecord'. Non sono sicuro del motivo per cui il mio post originale diceva "defstruct". – Sonicsmooth