1

我将如何延迟序言中的执行?我可以threadDelay ms在 Haskell 中将其延迟ms几毫秒。有没有办法在序言中做到这一点?我的意思是我可能只做一堆空查询,比如

delay(0).
delay(X) :- delay(Y), Y is X - 1.

但这似乎是一个愚蠢和错误的想法。

编辑:

显然有sleep/1。但是,当我做类似的事情时

delayText([H|T]) :- put_char(H), sleep(0.1), delayText(T).
delayText([]).

, sleep 将首先执行(所以它会在查询时休眠 0.5 秒delayText("Hello").)然后它会立即显示所有文本?我该如何防止这种情况?

4

1 回答 1

1

只是为了正式化我的回答,在 SWI-Prolog 中,您可以使用它sleep/1来延迟该过程。我在这个列表中没有看到 ISO 谓词,我也不期待它,因为该标准并没有真正指定关于线程或其他低级操作系统问题的太多内容。

要修复delayText/1,您只需要添加flush_output. 这与 Haskell 中的基本相同hFlush stdout,但您也可以在 Haskell 中更改输出流的刷新模式hSetBuffering。SWI 版本open/4支持一个buffer选项,但它提到这不是 ISO,因此可能没有 ISO 方法可以导致刷新自动发生或使输出无缓冲,但希望有更多标准经验的人会出现如果我错了,请纠正我。

更正后的代码如下所示:

delayText([H|T]) :- put_char(H), flush_output, sleep(0.1), delayText(T).
delayText([]).

我可能会这样写:

delay_put_char(X) :- put_char(X), flush_output, sleep(0.1).
delayText(X) :- maplist(delay_put_char, X).
于 2013-03-19T16:02:20.907 回答