2014-09-10 20 views
5

Sto riscontrando problemi da SICP, utilizzando la direttiva #lang planet/neil in Racket. Preferirei scrivere il mio codice in Emacs, e sto usando la modalità Geiser per eseguire un REPL Racket tramite Emacs.Cambia stile di stampa di output da Racket REPL

Il modo in cui la racchetta stampa i risultati tende a utilizzare molto mcons che rende i risultati difficili da leggere.

[email protected]> (list 1 2 3 4) 
(mcons 1 (mcons 2 (mcons 3 (mcons 4 '()))))  

Secondo this other question, lo stile di uscita può essere cambiato all'interno DrRacket selezionando l'opzione "scrivere" stile di output nella finestra di dialogo Scegli lingua. Tuttavia ciò richiede la GUI di DrRacket; c'è un modo per cambiare questa impostazione per il REPL Racket?

risposta

9

Sfondo: a differenza dello Schema di stile SICP, la racket list s è immutabile. Per ottenere elenchi modificabili, in Racket usi mlist. Cosa fa #lang planet/neil/SICP (sto suggerendo) è (require mpair) e quindi rinominare mlist a list. Pertanto, quando scrivi list in quello #lang, stai effettivamente utilizzando mlist.

In ogni caso, la stampa mlist s differisce, per impostazione predefinita. Ma puoi cambiare due parametri.

print-as-expression

(print-as-expression #f) 

Ora verrà stampata come

{1 2 3 4} 

Le parentesi graffe invece di parentesi indicano che si tratta di una lista mutevole. Per modificare che, impostare un altro parametro:

print-mpair-curly-braces

(print-mpair-curly-braces #f) 

Ed ora, dovrebbe stampare come:

(1 2 3 4) 

Per avere la racchetta pianura REPL sempre fare questo, ho pensa di poter inserire queste due espressioni nel tuo Racket init file, ad es ~/.racketrc su OSX e Linux. Anche se non sono sicuro che il REPL fornito da Geiser leggesse il file init, se si evalideranno tali espressioni una volta che dovrebbero persistere per una sessione REPL Geiser, in modo da poterle inserire in qualche file .rkt e visitarlo una volta.

+1

Grazie! Una cosa da aggiungere, questi comandi non sono accessibili quando REPL è all'interno di SICP, ma posso digitare ', inserire # f' o premere' C-c C-m' in geiser per tornare al livello superiore. – crowding

+1

Ah, OK, quindi '#lang SICP' non li fornisce. Penso che tu possa usare '(richiede (solo-in racket/base print-as-expression print-mpair-curly-braces)) per renderli disponibili. –

+1

Come sidenote, puoi, piuttosto facilmente, far leggere a Geiser il file '~/.racketrc' inserendo quanto segue nel tuo' geiser-racket-init-file' (che si trova in '~/.racket-geiser') di default): '(carica (find-system-path 'init-file))' – GDP2