2014-09-10 65 views
5

我在使用球拍中的#lang planet/neil指令來解決SICP問題。我更願意在Emacs中編寫我的代碼,並且我使用Geiser模式通過Emacs運行Racket REPL。從球拍更改輸出打印樣式REPL

球拍打印結果的方式傾向於使用很多mcons,這使得結果難以閱讀。

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

this other question,輸出風格可以內部DrRacket通過在選擇語言對話框中選擇「寫入」輸出樣式改變。但是這需要DrRacket GUI;有沒有辦法改變球拍REPL的這個設置?

回答

9

背景:與SICP風格的方案不同,球拍list是不可變的。要獲得可變列表,請在球拍中使用mlist#lang planet/neil/SICP(我在猜測)是(require mpair),然後將mlist重命名爲list。所以當你在#lang中寫list時,你實際上使用的是mlist

無論如何,mlist默認打印方式不同。但是你可以改變兩個參數。

print-as-expression

(print-as-expression #f) 

現在將打印爲

{1 2 3 4} 

大括號,而不是括號表明它是一個可變的列表。要調整,設置其他參數:

print-mpair-curly-braces

(print-mpair-curly-braces #f) 

現在它應該打印爲:

(1 2 3 4) 

要讓普通球拍REPL總是這樣做,我認爲你可以把這兩個表達式放在你的Racket init file中,例如OSX和Linux上的~/.racketrc。雖然我不確定由Geiser提供的REPL是否讀取init文件,但是如果您一旦持續進行Geiser REPL會話時評估這些表達式,那麼您可以將它們放入一些.rkt文件並訪問它一次。

+1

謝謝!有一件事要補充,當REPL位於SICP內部時,這些命令不可訪問,但我可以在'geiser'中輸入',輸入#f'或按'C-c C-m'返回頂層。 – crowding 2014-09-11 20:18:48

+1

啊,好的,'#lang SICP'不提供它們。我認爲你可以使用'(要求(只有 - 在球拍/基本打印 - 表達式打印 - mpair - 花括號))'使它們可用。 – 2014-09-12 00:44:09

+1

作爲一個旁註,通過將以下內容放置在'geiser-racket-init-file'(它位於'〜/ .racket-geiser'中),您可以輕鬆地讓Geiser讀取'〜/ .racketrc'文件。默認):'(load(find-system-path'init-file))' – GDP2 2016-11-04 20:15:39