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