Clojure:操纵场景图的函数方法 上下文

Clojure:操纵场景图的函数方法 上下文,clojure,Clojure,我正在处理一个大型嵌套结构化文档,它在屏幕上显示为场景图。用户需要能够修改这个文档——我目前正在使用功能性拉链来实现它 现在,在每次更改后,我都会重新绘制整个文档。但是,当使用场景图时,我只需要修改更改的部分 然而(我并不打算发动一场火焰战),我越来越觉得这个问题从根本上讲是一个关于国家的问题,而不是功能的问题。特别是: 用户操作(上、下、左、右、插入字符、删除字符)是关于操作状态,而不是进行计算 文档一次只有一个副本,它只被一个线程命中,共享没有好处 当前方法 我使用功能拉链来存储文档并提

我正在处理一个大型嵌套结构化文档,它在屏幕上显示为场景图。用户需要能够修改这个文档——我目前正在使用功能性拉链来实现它

现在,在每次更改后,我都会重新绘制整个文档。但是,当使用场景图时,我只需要修改更改的部分

然而(我并不打算发动一场火焰战),我越来越觉得这个问题从根本上讲是一个关于国家的问题,而不是功能的问题。特别是:

  • 用户操作(上、下、左、右、插入字符、删除字符)是关于操作状态,而不是进行计算

  • 文档一次只有一个副本,它只被一个线程命中,共享没有好处

当前方法 我使用功能拉链来存储文档并提供状态操纵功能。然后,我不断地重画

我认为解决方案可能是正确的: 将所有内容存储在场景图、沟渠函数拉链中,修改后,直接修改场景图中发生更改的部分

技术问题: 其他人处理过这个问题吗?这个问题有一个正式的技术名称吗?(相当于并发的“用餐哲学家”)这个问题有一个公认的解决方案吗

免责声明 这个问题有点软。我无法粘贴最小破格的代码示例,因为

* my code is around 5K LOC
* it's not for me to share publicly
然而,这是一个真正的技术解决方案,我希望其他人能够分享他们的答案


谢谢

你的基本过程听起来不错。它的当前形式是灵活的,因为您可以选择让一个单独的线程更新树,例如,您可以实现一个“undo”按钮。如果每次修改后都返回新树和更改零件的路径,则只能更新显示中更改的零件。很多人在区分“模型”和“观点”方面比我有更强烈的观点,尽管我怀疑至少他们的一些智慧适用于这里

你的用户号是prime!令人惊叹的!