如何防止(随机)表达式在一个手表表达式缓存,或重新评估他们?



或者,是否有办法强制对单个watch表达式重新求值?

假设我有以下watch表达式:

> Random.splitmix 123 '(Random.natIn 0 100)

当我运行这个命令时,我可能会看到如下的结果:

Now evaluating any watch expressions (lines starting with `>`)... Ctrl+C cancels.

5 | > Random.splitmix 123 '(Random.natIn 0 100)
⧩
56

再次保存文件将每次显示相同的结果(它被缓存)。

我不确定随机结果是否应该永远不被缓存(也许这仍然是节省计算时间的良好默认行为),但只是想知道最好的解决方案是什么。

debug.clear-cache在这种情况下也不起作用,因为每次RNG (Random.splitmix)都以相同的种子重新开始。

当然,我们可以手动更改随机种子,但这也可能并不总是期望的行为(并且一个小问题是它涉及不必要的击键并创建额外的缓存-每个种子一个缓存结果,因此您必须回忆您已经使用了哪些种子)。

UCM中可以使用debug.clear-cache清除表达式缓存

也就是说,重新计算表达式实际上每次都会给出相同的结果!splitMix函数是完全确定的,因此您得到的结果取决于您提供的种子,而不是其他任何东西。

你可以清空这里的缓存,但它不会做任何事情

要获得一个真正随机的值,您需要使用IO,这在watch表达式中是不允许的。您需要在UCM中使用run为您的程序提供I/O。

由于watch表达式需要以某种方式保持随机状态,这可能比它的价值更麻烦,因此手动编辑随机种子可能是最好的折衷办法。只是重新计算总是从给定的随机种子产生的初始值开始。

对一组随机值求值可能是有用的。

最新更新