2011-11-15 29 views
4

如何更改球拍中的輸入端口?更改球拍中的當前輸入端口

也就是說,假設我創建一個新的輸入端口:

(define my-port (open-input-string "this is a test")) 

我怎樣才能讓這個現在(current-input-port)返回my-port

回答

3
(current-input-port my-port) 

不要在racket REPL!這將導致所有後續的REPL輸入來自該源。 (可以在DrRacket中運行,但是,即使在DrRacket REPL中也是如此)。

+0

太棒了,謝謝!那是我正在尋找的確切的東西。 – Cam

7

要添加到Chris的答案;當前的輸入端口就是所謂的「參數」,它非常接近動態範圍的設置/變量。一般來說,使用'參數化'來設置當前輸入端口只是暫時的更清潔和更保守。就像這樣:

(parameterize ([current-input-port my-port]) 
    ... do some stuff ... 
) 

評估此代碼將導致輸入端口,爲您的身體的代碼和它調用的任何代碼中設置,但不會「流血了」成在外面評估代碼;它也將取消特殊或延續退出的更改。

+0

我查看了球拍文檔的參數設置,但我無法理解它。球拍如何知道當前輸入端口是一種可以改變某些隱藏值的函數?還是它只是採取所有的副作用,並使他們暫時(只在內...做一些東西...然後它改變他們回來)? – Cam

+5

'parameter'只是一個可以用0或1個參數調用的函數。傳遞1個參數,它將「設置」一個新值。傳遞0個參數,它將「獲取」當前值。目前爲止有意義嗎?接下來,'parameterize'可以用於任何這樣的函數。它只是做一個「get」來保存原始值,一個你想要的值的「集合」,然後它執行你的「..做一些東西..」,它恢復原始值(它做了一個「set 「它的價值原來是」得到「,或者erm,'got」),最後它返回你的「..有些東西..」的價值 –

+4

ps我簡單地回答了我認爲的要點實際上,一個Racket'參數'也是每個線程的,另外,'parameterize'可以讓你保存/設置/恢復多個參數,這很方便,而且很有可能還有其他的細微差別,yoda-level但是,我只是想回答「參數化怎麼知道'current-input-port'是一個變異隱藏變量的函數?」 –