改变球拍中的当前输入端口

Cam*_*Cam 4 scheme racket

如何更改球拍中的输入端口?

也就是说,假设我创建了一个新的输入端口:

(define my-port (open-input-string "this is a test"))
Run Code Online (Sandbox Code Playgroud)

我怎样才能让它现在(current-input-port)回归my-port

Joh*_*nts 7

添加克里斯的回答; 当前的输入端口是所谓的"参数",它几乎是一个动态范围的设置/变量.通常,使用'parameterize'暂时设置当前输入端口更干净,更保守.像这样:

(parameterize ([current-input-port my-port])
  ... do some stuff ...
  )
Run Code Online (Sandbox Code Playgroud)

评估此代码将导致为您的正文代码和它调用的任何代码设置输入端口,但不会"渗透"到外部评估的代码中; 它还将撤消基于例外或基于继续的退出的更改.

  • `参数`只是一个可以用0或1参数调用的函数.传递1个参数,它将"设置"一个新值.传递0个参数,它将"获取"当前值.到目前为止有道理吗?接下来,`parameterize`将适用于任何此类函数.它只是一个"获取"来保存原始值,一个你想要的值的"设置",然后它执行你的"..do some some stuff ..",它恢复原始值(它做一个"集合"它最初"得到"的价值,或者呃,"得到".最后它返回你的"......有些东西......"的价值. (5认同)
  • ps我过度简化了回答我认为是你问题的要点.实际上,一个Racket`参数`也是每个线程.此外,`parameterize`允许您保存/设置/恢复多个参数,这很方便.也有可能还有其他细微差别,尤达级别的Racketeers可以指出.但同样,我只想回答"如何`参数化`知道`current-input-port`是一个改变隐藏变量的函数?". (4认同)

Chr*_*ung 3

(current-input-port my-port)
Run Code Online (Sandbox Code Playgroud)

不要在racketREPL 中这样做!这将导致所有后续 REPL 输入都来自该源。(不过,即使在 DrRacket REPL 中,也可以在 DrRacket 中运行。)