2014-09-10 9 views
5

Robię problemy z SICP, używając dyrektywy #lang planet/neil w Racket. Wolałbym napisać mój kod w Emacsie i używam trybu Geisera do uruchamiania REPLIKU Racketowania przez Emacsa.Zmień styl drukowania wyjściowego z Rakiety REPL

Rakiety w wynikach próbnych używają często dużo mcons, co sprawia, że ​​wyniki są trudne do odczytania.

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

Według this other question, styl wyjściowy może być zmieniona wewnątrz DrRacket wybierając „write” styl wyjściowy w oknie dialogowym wybierz język. Wymaga to jednak GUI DrRacket; czy istnieje sposób na zmianę tego ustawienia REPL?

Odpowiedz

9

Tło: W przeciwieństwie do schematu w stylu SICP, rakiety list s są niezmienne. Aby uzyskać listę zmienną, w Rakiecie używaj mlist. To, co #lang planet/neil/SICP robi (jak się domyślam) jest (require mpair), a następnie zmienia nazwę mlist na list. Więc kiedy piszesz list w tym #lang, faktycznie używasz mlist.

W każdym razie, mlist s są drukowane inaczej, domyślnie. Ale możesz zmienić dwa parametry.

print-as-expression

(print-as-expression #f) 

Teraz zostanie wydrukowana jako

{1 2 3 4} 

Nawiasy klamrowe zamiast nawiasach wskazują, że jest to lista zmienny. Wykręcanie że ustawić inny parametr:

print-mpair-curly-braces

(print-mpair-curly-braces #f) 

I teraz należy wydrukować jako:

(1 2 3 4) 

aby mieć zwykły Racket REPL zawsze to robię myślę, że możesz umieścić te dwa wyrażenia w swoim Racket init file, np ~/.racketrc w systemach OSX i Linux. Chociaż nie jestem pewien, czy REPL dostarczony przez Geisera odczytał plik init, czy eval tych wyrażeń, gdy powinny się one utrzymywać dla sesji REPL Geisera, można je umieścić w pliku .rkt i odwiedzać je raz.

+1

Dzięki! Jedna rzecz do dodania, te polecenia nie są dostępne, gdy REPL jest w SICP, ale mogę wpisać ', wprowadź # f' lub naciśnij' C-c C-m' w geizerze, aby powrócić do najwyższego poziomu. – crowding

+1

Ah, OK, więc '#lang SICP' nie zapewnia ich. Myślę, że możesz użyć '(require (tylko w racket/base print-as-expression print-mpair-curly-braces)), aby je udostępnić. –

+1

Jako sidenote, możesz, raczej, sprawić, że Geiser odczyta plik '~/.racketrc', umieszczając następujący plik w twoim' geiser-racket-init-file' (który znajduje się na '~/.racket-geiser') domyślnie): '(load (find-system-path 'init-file))' – GDP2