clojure/lisp程序是如何作为图表建模的?

clojure/lisp程序是如何作为图表建模的?,clojure,lisp,diagram,Clojure,Lisp,Diagram,我曾尝试将clojure图嵌入UML中可用的内容,使用类块作为文件级名称空间和依赖项链接来显示关系,但这很尴尬,而且往往会阻碍功能模式。我也尝试过开发特别的解决方案,但是我没有发现一个解决方案可以像UML和Java一样工作(简单的有向图似乎以一种模糊的方式工作,但是结果不够详细)。此外,我在网上找不到任何与此相关的信息 我要说的是,我不想做任何像代码生成这样的花哨的事情;我只是为了我自己的利益而谈论纸笔图表。我想我不是第一个考虑过lisp语言的人 提出了哪些解决办法?有什么常用的标准吗?你推荐什

我曾尝试将clojure图嵌入UML中可用的内容,使用类块作为文件级名称空间和依赖项链接来显示关系,但这很尴尬,而且往往会阻碍功能模式。我也尝试过开发特别的解决方案,但是我没有发现一个解决方案可以像UML和Java一样工作(简单的有向图似乎以一种模糊的方式工作,但是结果不够详细)。此外,我在网上找不到任何与此相关的信息

我要说的是,我不想做任何像代码生成这样的花哨的事情;我只是为了我自己的利益而谈论纸笔图表。我想我不是第一个考虑过lisp语言的人


提出了哪些解决办法?有什么常用的标准吗?你推荐什么?使用什么工具?

< P>,UML深深植根于面向对象设计(C++)中,因此很难用UML来映射功能方法。我对Clojure不太了解,但您可能能够表示类似于Java类和接口(协议?)的东西,对于所有其他类来说,这将非常困难。 FP更像是从输入到输出的一系列转换,没有明确的UML图(可能是活动图?)。最常见的图表用于静态结构和对象之间的交互,但它们对于FP范式并不真正有用。
根据您的目标,组件和部署图可能适用。

我认为它与语言无关,而与您的概念模型有关。如果您采用的是“流处理”方法,那么数据流网络图可能是正确的方法,如在一些示例中所示。如果您采用更面向对象的方法(在Lisp中得到很好的支持),那么UML活动图可能更有意义。

我也一直在努力解决这个问题。我发现流程图对于基本函数和数据非常有用。这样很容易显示数据和数据流。条件和递归很简单。UML序列/协作图可以很好地捕获一些相同的信息

然而,一旦您开始使用HOF,它就根本无法正常工作


包的普通UML图对于名称空间来说可以正常工作,但这并没有多大作用。

这取决于您希望在程序中描述什么

依赖关系

使用类图对名称空间之间的依赖关系建模;在这种情况下,如果在图中使用包而不是类,则更清楚

您还可以使用类图来建模参与者之间的依赖关系

数据流

您还可以使用对程序中的数据流建模。在本例中,将每个名称空间描述为一个实体,将每个函数描述为该实体的一个方法

或者,对于参与者,将每个参与者描述为一个实体,将每个消息描述为一个方法


在任何情况下,试图用UML描述程序的算法都是没有用的。根据我的经验,它们最好在源文件的注释中进行描述。

我个人的想法是对数据流进行建模,而不是对代码的结构进行建模,因为从我所看到的大型(不是那么大)Clojure项目来看,代码布局往往非常枯燥,有一大堆可组合的实用程序,还有一个类将它们与map、redure和STM事务连接在一起


Clojure在您选择的模型中非常灵活,因此您可能希望换一种方式来解决这个问题。首先制作图表,然后选择语言的部分和模式,这些部分和模式清晰地表达了您构建的模型

我不认为像UML这样的东西很适合Clojure-UML相当关注面向对象的范例,而在Clojure中通常不鼓励这种范例

当我在做函数式编程时,我倾向于更多地考虑数据和函数:

  • 我需要什么数据结构?在Clojure中,这通常归结为为为我正在处理的每个重要实体定义一个映射结构。在简单的情况下,一个简单的字段列表就足够了。在具有许多不同实体的更复杂的情况下,您可能需要绘制一棵显示数据结构的树(其中树中的每个节点表示一个映射或记录类型)
  • 这些数据结构如何通过不同的转换函数来获得正确的结果?理想情况下,这些纯函数以不可变值作为输入,并生成不可变值作为输出。通常,我会将其绘制为管道/流程图
如果您充分考虑了上述内容,那么转换为Clojure代码就相当容易了

  • 为数据结构定义一个或多个构造函数,并编写两个测试来证明它们工作正常
  • 自下而上编写转换函数(即,首先让最基本的操作工作并测试,然后将它们组合在一起以定义更大的函数)。为每个函数编写测试
  • 如果您需要GUI或IO等实用程序功能,请根据需要编写它们
  • 将它们粘在一起,在REPL进行测试以确保一切正常 请注意,您的源文件通常也将按照上面列出的顺序进行结构,顶部有更多的基本函数,底部有更高级别的组合函数。您不应该需要任何循环依赖项(这在Clojure中是一种糟糕的设计味道)。测试是至关重要的——在Clojure这样的动态语言中,测试比静态类型的OOP语言更重要


    我的代码的总体逻辑通常是主源代码文件的最后几行。

    我非常喜欢这些用于低级或中级建模的示例。这是一个类似的r