如何将clojure/lisp程序建模为图表?

jk.*_*jk. 27 lisp diagram clojure

我已经尝试将我的clojure图表嵌入到UML中可用的内容中,使用类块作为文件级命名空间和依赖关系链接来显示关系,但它很尴尬并且往往会阻碍功能模式.我也尝试过开发ad-hoc解决方案,但是我发现一个解决方案和Java一样好用Java(简单有向图似乎工作模糊,但结果不详细足够).此外,我在网上找不到任何关于此的内容.

为了清楚起见,我并没有尝试像代码生成那样做任何事情; 我只是为了自己的利益而谈论纸笔图.我假设我不是第一个考虑使用lisp语言的人.

提出了哪些解决方案?有没有常用的标准?您有什么推荐的吗?你用什么工具?

Leo*_*nel 13

这取决于您想要在程序中描述的内容.

依赖

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

您还可以使用类图来模拟actor之间的依赖关系

数据流

您还可以使用通信图来为程序中的数据流建模.在这种情况下,将每个名称空间描述为一个实体,并将每个功能描述为该实体的方法.

或者,在演员的情况下,将每个演员描绘为一个实体,并将每个消息描述为一种方法.

在任何情况下,尝试用UML 描述程序的算法都没有用.根据我的经验,它们在源文件的注释中有更好的描述.


Mau*_*gan 9

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


GCl*_*unt 8

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


Art*_*ldt 8

我个人的想法是模拟数据的流程而不是代码的结构,因为从我看到的大型(不是那么大)Clojure项目中,代码布局往往非常无聊,有大量可编写的实用程序和一个使用map,redure和STM事务将它们连接在一起的类.

Clojure在您选择的模型中非常灵活,因此您可能希望采用相反的方式.首先制作图表,然后选择干净地表达您构建的模型的语言的部分和模式.


mik*_*era 5

我认为像UML这样的东西不适合Clojure - UML更侧重于面向对象的范式,而这在Clojure中通常是不鼓励的.

当我在进行函数式编程时,我倾向于在数据和函数方面考虑更多:

  • 我需要哪些数据结构?在Clojure中,这通常归结为为我正在处理的每个重要实体定义一个地图结构.一个领域的简单列表是在简单的情况下往往不够.在具有许多不同实体的更复杂的情况下,您可能希望绘制一个显示数据结构的树(树中的每个节点代表一个地图或记录类型)
  • 这些数据结构如何通过不同的转换函数来获得正确的结果?理想情况下,这些是纯函数,它将不可变值作为输入,并将不可变值作为输出.通常我将这些描绘为管道/流程图.

如果你已经仔细考虑了上述内容,那么转换为Clojure代码非常简单.

  1. 为您的数据结构定义一个或多个构造函数,并编写几个测试来证明它们正在工作
  2. 从头到尾编写转换函数(即首先使最基本的操作工作和测试,然后将它们组合在一起以定义更大的函数).为每个功能编写测试.
  3. 如果您需要GUI或IO等实用程序功能,请根据需要随时编写.
  4. 将它们粘合在一起,在REPL上进行测试以确保一切正常.

请注意,源文件通常也将按照上面列出的顺序进行结构化,顶部有更多基本功能,高级功能组成底部功能.你不应该需要任何循环依赖(这在Clojure中是一个糟糕的设计气味).测试至关重要 - 恕我直言,在Clojure等动态语言中比在静态类型的OOP语言中更为重要.

我的代码的整体逻辑通常是我的主要源代码文件的最后几行.