【发布时间】:2016-02-12 11:10:20
【问题描述】:
我有一个带有原子的小 Clojurescript 程序。一个字符串被放入这个原子中,它是一个函数 (low-level-fn) 的配置,程序中几乎所有其他函数都使用该函数。接收所有配置的程序有一个入口点。该程序的运行结构是一棵倒置的树,其中许多叶子实际上是low-level-fn。
我的意图总是摆脱这个原子作为完成程序的一部分 - 通过将配置字符串传递给外部函数使其成为高阶函数。通过添加最左边的参数(即字符串配置)并创建部分函数来做同样的事情。无论哪种情况,这个“尚未完成”的函数都在入口点函数中构建。
我的问题是程序可能会变得比使用 atom 时更糟,因为“尚未完成”的函数必须作为参数传递给程序中的几乎所有函数。
我还应该考虑其他想法吗?我很可能会摆脱原子以使整个程序成为一个纯函数。 edit - 实际上有或没有原子,程序仍然是一个纯函数。 编辑 - 是吗?
【问题讨论】:
-
“程序可能会变得更糟 [...] 因为“尚未完成”的功能必须作为参数传递给程序中的几乎所有功能" 为什么传递函数比传递原子更糟糕?
-
在阅读程序时,几乎每个函数都需要考虑这个额外的参数,这是一个低级的关注点,与所讨论的函数无关。没有它,程序会干净得多。
-
配置是否会在执行时发生变化?如果没有,您可以在一开始就使用 Var,例如
(def configuration your-reading-config-function)。 -
不在执行期间,但这是一个库,用户提供配置字符串。
-
如果我理解正确的话,你想根据用户输入生成一个函数,然后重复调用这个函数。一个新的输入应该创建一个不同的函数并重新运行程序。在这种情况下,依赖原子是错误的安全性——假设您在其中一个线程完成之前从两个并发线程调用函数——在这种情况下,当原子被修改时,两个线程的函数都将被更改。在这种情况下,我不确定是否有其他方法可以传递任何信息(或者更好的是函数)。
标签: clojure clojurescript