gpt4 book ai didi

haskell - 在单个 session 中多次可移植地打开标准输入的句柄

转载 作者:行者123 更新时间:2023-12-02 10:54:53 27 4
gpt4 key购买 nike

代码:

main = do
putStrLn "4917 Microprocessor\nEnter the Machine Code to be run: "
inp <- getContents
putStrLn "The output of the Program is:"
fState <- ((runStateT _4917) . construct . parse) inp
args <- getArgs
if elem "-v" args then putStrLn ("\nFinal state was: " ++ (show . snd) fState) else return ()
putStrLn "\n================================ RESTART ================================"
main
where parse xs = array (0,15) $
zip [0..15] $
take 16 $
map ((makeArbInt 4) . read) (words (filter ((/=)'.') xs)) ++ repeat (makeArbInt 4 0)
construct xs = Program xs z z z z 0 False
z = (makeArbInt 4 0)

还有更多,但这是相关的部分。基本上第 3 行需要多次计算,但 getContents 正在关闭标准输入句柄:

4917: <stdin>: hGetContents: illegal operation (handle is closed)

有办法重新打开 handle 吗?或者有什么方法可以阻止 getContents 这样做? (也许我发送了错误的信号。我在 Linux 上通过 Ctrl-D EOF 发送。也许我应该使用 EOT 或其他东西来代替?)

编辑:我已经设法获得所需的行为,但它不会移植到 Windows。

mystdin <- openFile "/dev/tty" ReadMode
inp <- hGetContents mystdin

新问题:是否有一种通用方法可以可移植打开标准输入的句柄?

最佳答案

您无法阻止 getContents 关闭文件,并且关闭的文件将保持关闭状态。

在我看来,你还需要一些其他功能。通常,当您读取文件的某些部分时,您知道何时停止(行尾、流上的某些字节)。所以是的:如果您无法解析正在读取的数据并检测它何时完成,则应该使用某种分隔符(可能是 EOT,或空行,或数据中不太可能出现的特殊文本,例如 __END__ )。

关于haskell - 在单个 session 中多次可移植地打开标准输入的句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17123897/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com