gpt4 book ai didi

elm - 为什么我不能在 Elm REPL 的无限循环中从 Debug.log 获得输出?

转载 作者:行者123 更新时间:2023-12-04 21:59:39 26 4
gpt4 key购买 nike

我正在用无限循环调试一些代码,但这很困难,因为我无法输出任何日志消息。这是一个简化的案例:

import Debug exposing (log)

f x =
let _ = log "Hello, world!" ()
in f x

如果我在我的 Elm REPL 上像 f () 一样运行它,它会无限循环并且永远不会像我期望的那样打印出 "Hello, world!"

我查看了 Debug.log 的实现(跟随它到 Native.Debug.log),但它似乎只是在调用 process.stdout .writeconsole.log 同步,所以我很惊讶我没有看到任何输出。

最佳答案

这只是 Elm REPL 中的一个错误。

问题

我投入到 Elm REPL 的实现中。相关函数在这里:Eval.Code.run

这个run函数好像是执行一段代码的函数。看起来每一行代码都是通过 Elm.Utils 在子进程中执行的。展开运行。它的运行方式有两个问题:

  • 子进程的标准输出没有流式传输;只有在整个子流程完成后才会返回。因此,只要您等待代码完成评估,您就不会看到任何东西。
  • 如果您按 ctrl-c 键提前结束求值(效果很好,并返回到 Elm 提示符),Elm Repl 会忽略返回给它的标准输出。注意 pattern match for CommandFailed :

左(Utils.CommandFailed _out 错误)->
throwError 错误

Utils.CommandFailed 结果包含标准输出(它被绑定(bind)到 _out),但这段代码会忽略它并直接抛出错误。

所以基本上这并不是 Elm 编译器或运行时发生的任何奇怪的事情,只是 REPL 在记录结果方面不如它应有的好。

解决方法

作为解决方法,为了调试诸如无限循环之类的东西,您可以

  1. 将一些测试代码放入一个新文件Scratch.elm,如x = f()
  2. 使用elm-make Scratch.elm --output scratch.js编译代码
  3. 使用 node scratch.js 运行代码

然后输出将流式传输到您的终端。

关于elm - 为什么我不能在 Elm REPL 的无限循环中从 Debug.log 获得输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41838717/

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