【发布时间】:2017-01-24 20:48:23
【问题描述】:
我正在调试一些带有无限循环的代码,但这很困难,因为我无法输出任何日志消息。这是一个简化的案例:
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,所以我很惊讶我没有看到任何输出.
【问题讨论】:
-
我不知道 Elm 是否进行了优化传递,但如果是这样,为被忽略的绑定赋值可能会被优化掉。您是否尝试过此操作而不将日志值分配给
_? -
好吧,它不会在非无限递归的情况下优化它:
f x = let _ = log "Hello, world!" () in 5然后调用f ()会打印Hello, world! -
@w.brian 正确的编译器只会优化掉未使用的表达式,前提是它可以证明它没有副作用。将
let _ = side_effecting_expression in foo优化为foo将是一个非常不正确的优化。 PS:let _ = ...实际上并没有引入绑定。 -
@sepp2k 就编译器所知,log 是一个纯函数,将其优化掉是正确的。它不纯的事实对编译器是隐藏的,并且文档非常清楚地指出,出于这个原因,它不应该在生产中使用。
标签: elm