2012-02-19 18 views
8

Non riesco a leggere l'output dalla racchetta DR. Di default mostra liste usando mcons. Ad esempio, esercizio sicp 2.32 produce:mcons in dr racket

> (subsets (list 1 2 3)) 
(mcons 
(mcons 
    '() 
    (mcons 
    (mcons 3 '()) 
    (mcons 
    (mcons 2 '()) 
    (mcons 
    (mcons 2 (mcons 3 '())) 
    (mcons 
     (mcons 1 '()) 
     (mcons 
     (mcons 1 (mcons 3 '())) 
     (mcons 
     (mcons 1 (mcons 2 '())) 
     (mcons (mcons 1 (mcons 2 (mcons 3 '()))) '())))))))) 
'()) 

Ho problemi a leggere questo. C'è un modo per rendere l'output simile:

(() (3) (2) (2 3) (1) (1 3) (1 2) (1 2 3)) 

Grazie!

risposta

12

Sai quale lingua stai usando nella tua linea #lang? Il resto delle istruzioni seguenti presuppone che si stia utilizzando una linea #lang.


Se siete in #lang r5rs e si display o write i valori, si dovrebbe vedere l'output che ci si aspetta.

> (define p (list 1 2)) 
> (display p) 
(1 2) 
> (set-car! p 'one) 
> (display p) 
(one 2) 

Se è sufficiente digitare i valori nudi nelle interazioni, DrRacket li print, e che utilizza la rappresentazione che stai vedendo. In DrRacket, è possibile customize il modo che valori print. Ecco il processo, step-by-step:

  1. Vai alla Lingua menù e selezionare Choose Language. Dovresti vedere apparire la finestra di dialogo della lingua.

  2. Se il pulsante in basso a sinistra indica Mostra dettagli, fare clic su di esso e la finestra di dialogo dovrebbe espandersi per includere le personalizzazioni.

  3. Cercare l'opzione Output Style. Non ci dovrebbero essere quattro scelte: Constructor, Quasiquote, scrittura, e stampa. Selezionare scrivere lo stile, quindi premere Ok per confermare la personalizzazione.

Una volta fatto questo, allora:

> (display (list 1 2)) 
(1 2) 
> (write (list 1 2)) 
(1 2) 
> (list 1 2) 
{1 2} 

sarà ancora stampare un po 'diverso dal previsto, utilizzando le parentesi graffe, perché sta cercando di annotare che la struttura della lista è mutevole.

Se questo ti dà fastidio, possiamo aggiustarlo. Aggiungi la seguente riga nella parte superiore del tuo programma (ma dopo la riga #lang).

(#%require r5rs/init) 

Questa linea tira dentro un modulo specifico Racket chiamato r5rs/init che cerca di migliorare il rispetto R5RS; in particolare, le parentesi graffe dovrebbero finalmente stampare come rotonde per coppie mutabili.

> (display (list 1 2)) 
(1 2) 
> (write (list 1 2)) 
(1 2) 
> (list 1 2) 
(1 2) 
+0

Grazie! Lo stile di scrittura ha fatto il trucco. Stavo usando #lang planet neil/sicp.Ma ora con il linguaggio di stile di scrittura mostrato come SICP PLaneT 1.16 personalizzato e che dice "leggi: #lang non abilitato nel contesto corrente", ho dovuto commentare la riga #land per farlo funzionare. – Dmitri

+1

Fresco. Seguirò Neil in seguito per vedere se i valori predefiniti del suo pacchetto possono essere modificati in modo che sia ** write ** per impostazione predefinita. – dyoo

+0

Come si configura lo stile di output se si sta eseguendo da un terminale piuttosto che da DrRacket? (Sto eseguendo Racket tramite la modalità geiser in Emacs). – crowding