2011-11-15 6 views
4

ラケットの入力ポートを変更するにはどうすればよいですか?あるラケットの現在の入力ポートを変更する

、私は新しい入力ポートを作成するとします。

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

どのように私はそれ(current-input-port)戻り今my-portようにすることができますか?

答えて

3
(current-input-port my-port) 

REPL!racketでこれを行わないでください!これにより、その後のすべてのREPL入力がそのソースから来るようになります。 (ただし、DrRacket内で実行するのは問題ありませんが、DrRacket REPLでも実行できます)。

+0

恐ろしい、ありがとう!それが私が探していたものでした。 – Cam

7

Chrisの回答に追加します。現在の入力ポートは「パラメータ」として知られており、これは非常にほぼ動的にスコープされた設定/変数です。一般に、 'parameterize'を使って現在の入力ポートを一時的にしか設定しないほうが、より洗練され、より慎重です。このように:このコードを評価

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

入力ポートは、あなたの体のコードと、それが呼び出す任意のコードのために設定されることになりますが、外部の評価を行っていますコードに「オーバーブリード」ではないでしょう。例外的または継続的な出口での変更も取り消します。

+0

私はラケットのドキュメント上でパラメータを調べましたが、私はそれを理解するのに苦労しています。ラケットは、current-input-portが隠れた値を変更する関数であることをどのように知っていますか?それとも、すべての副作用をとって一時的にするのですか(いくつかのことをしてから、それを元に戻します)。 – Cam

+5

'parameter'は単に0または1引数で呼び出すことができる関数です。引数1を渡すと、新しい値が設定されます。 0個の引数を渡すと、現在の値が取得されます。これまでのところ理にかなっている?次に、 'parameterize'はそのような関数で動作します。単に元の値を保存するために "取得"を行い、必要な値の "セット"を作成し、 "いくつかのものをいくつか"実行し、オリジナルの値を復元します( "set "それは元々"取得 "された値、または"得られた "値)の値を返す。最後に、あなたの" .. some stuff .. "の値を返す。 –

+4

ps私は思った通りに答えるためにそれを単純化した実際には、Racketの 'parameter'もスレッドごとです。また、' parameterize'は、複数のパラメータを保存/設定/復元することができます。便利です。また、yoda-levelしかし、ここでもまた、「current-input-port」が隠れ変数を変更する関数であることを 'parameterize'が知っているかどうかを知りたいと思っています。 –

関連する問題