1 个不稳定版本

0.1.0 2023年10月5日

#1867解析实现

MIT/Apache

180KB
424

DEML (DAG 提升标记语言)

警告:实验性

设计用来表示所有类型图数据结构的语言,例如 Graphviz 的 DOT 语言 和 Mermaid JS 的 流程图语法,没有充分利用 DAG 的特定属性(有向无环图)。

DAGs 就像河流。水流不会逆流而上(潮汐和洪水除外)。同一高度的河段不能是彼此的输入或输出,就像下面图片中的节点 C、D 和 E。它们的输入是 B。C 输出到 F,而 D 和 E 输出到 G。

Photo of a river to illustrate how DAGs operate

DEML 的目标是利用这种排序作为文件语法的部分,使其更容易被人解析。在 DEML 中,我们使用 ---- 在新的一行上表示提升标记。提升集群的顺序很重要,但两个提升标记之间的节点的顺序不重要。

UpRiver > A
----
A > B
----
B > C | D | E
----
C
D
E
----
F < C
G < D | E > DownRiver
----
DownRiver < F

节点由行上的第一个单词定义。定义的节点可以用 > 指向其输出,用 < 指向其输入。输入和输出由 | 分隔。

Dagrs

Dagrs 是一个库,用于运行在 DAG 中定义依赖关系的多个任务。在 DEML 中,可以使用 = 将 shell 命令分配给节点。可以使用命令 deml run -<filepath> 通过 dag-rs 运行 DEML 文件。

为了比较可读性的差异,以下是 YAML 和 DEML 中的 Dagrs YAML 示例

YAML

dagrs:
  a:
    name: "Task 1"
    after: [ b, c ]
    cmd: echo a
  b:
    name: "Task 2"
    after: [ c, f, g ]
    cmd: echo b
  c:
    name: "Task 3"
    after: [ e, g ]
    cmd: echo c
  d:
    name: "Task 4"
    after: [ c, e ]
    cmd: echo d
  e:
    name: "Task 5"
    after: [ h ]
    cmd: echo e
  f:
    name: "Task 6"
    after: [ g ]
    cmd: python3 ./tests/config/test.py
  g:
    name: "Task 7"
    after: [ h ]
    cmd: node ./tests/config/test.js
  h:
    name: "Task 8"
    cmd: echo h

DEML

H > E | G = echo h
----
G = node ./tests/config/test.js
E = echo e
----
F < G = python3 ./tests/config/test.py
C < E | G = echo c
----
B < C | F | G = echo b
D < C | E = echo d
----
A < B | C = echo a

Mermaid JS

要将 DEML 文件转换为 Mermaid 图表文件 (.mmd),请使用以下命令:deml mermaid -i <输入文件> -o <输出文件>。Mermaid 文件可以在 mermaid.live 上生成图像。

mermaid js flowchart image of the river DAG

目标

  • 将我关于基于升高的 DAG 表示的想法付诸实践
  • 使用 dag-rs 运行 DAG
  • 将 DEML 文件转换为 Mermaid 图表文件
  • 添加标签边语的语法

可能的目标

  • 语法高亮(Haskell 语法高亮在 README 中的示例中效果良好)

非目标

  • 支持商业产品

为什么?

我在想,在 C 等语言中,函数声明顺序很重要,这很烦人。然后我想知道是否有可能声明顺序很重要是件好事的情况,我想到了 DAG。

许可

以下任一许可下

任选。

贡献

除非您明确声明,否则您提交给作品并有意包含在内的任何贡献,根据 Apache-2.0 许可证的定义,应双许可如上所述,不附加任何额外条款或条件。

依赖关系

~6–16MB
~190K SLoC