我正在使用无限循环调试一些代码,但这很困难,因为我无法获取任何日志消息.这是一个简化的案例:
import Debug exposing (log)
f x =
let _ = log "Hello, world!" ()
in f x
Run Code Online (Sandbox Code Playgroud)
如果我在我的Elm REPL中运行f ()它,它会无限循环并且永远不会"Hello, world!"像我期望的那样打印出来.
我查看了Debug.log(跟随它Native.Debug.log)的实现,但它似乎只是调用process.stdout.write或console.log同步,所以我很惊讶我没有看到任何输出.
这只是Elm REPL中的一个错误.
我参与了Elm REPL的实施.相关功能在这里:Eval.Code.run
这个run函数似乎是执行一段代码的函数.看起来每行代码都是通过Elm.Utils在子进程中执行的.unwrappedRun.运行它的方式有两个问题:
Left (Utils.CommandFailed _out err) ->
throwError err
该Utils.CommandFailed结果有益包括标准输出(其被绑定到_out),但是这代码忽略它,只是引发错误.
所以基本上这不是Elm编译器或运行时奇怪的事情,只是REPL不如记录结果那么好.
作为一种解决方法,为了调试无限循环之类的东西,你可以
Scratch.elm,比如x = f ()elm-make Scratch.elm --output scratch.jsnode scratch.js然后输出将流式传输到您的终端.