刚学不久 Ruby 的小成果,分享一个写脑图的 DSL

2020-07-18 09:55:32 +08:00
 Mark24

背景

刚学不久 Ruby 的小成果,分享一个写脑图的 DSL

Gems 上看了一些,DSL 不够简单。直接用 Graphviz 或者用 Ruby 接入的接口,都略显复杂。

借鉴了 PlantUML 对 mindmap 的 DSL 语法。 语法简单,迅速表达。

地址

Github:https://github.com/Mark24Code/mini_mindmap

Gem: https://gems.ruby-china.com/gems/mini_mindmap

DSL

require "mini_mindmap"

name = 'mindmap' # filename

output = {
  format: 'png',
  dir: "#{Dir.home}/mindmap" # output dir
}

# online

dsl = %Q{
  * MiniMindmap
  ** name
  ** DSL
  ** output
  *** dir
  *** format
}

demo = MiniMindmap::Mindmap.new(name,dsl,output)

demo.export # export files to dir

输出

2166 次点击
所在节点    分享创造
8 条回复
Mark24
2020-07-18 15:53:45 +08:00
刚熟悉 Ruby 一周,目前功能比较简单。哈哈,后面有空再加。
crella
2020-07-18 17:28:41 +08:00
路过,支持。顺便,本站讨论 Ruby 的帖子都不怎么热门。
Mark24
2020-07-18 20:29:05 +08:00
@crella 🍻哈哈哈
msg7086
2020-07-19 01:06:27 +08:00
可…这不是 DSL 啊…
Mark24
2020-07-19 10:22:32 +08:00
@msg7086 哈哈,为啥不是?

DSL 也分,内部和外部 DSL 。这个实现了是以来 Ruby 去实现的,没有大动干戈去做编译器什么的。

Ruby 也鼓励构建这种内部 DSL 。


一方面可以导入 gem 包传给他解决,在 ruby 里调用它。 另一方面,我觉得额外实现比较好,我自己本地实现了一个读取只写内容的文件,直接转出结果。只看文件本身就是 DSL 。翻译并构建的 Ruby 脚本看起来就像是编译器。

差不多呀。哈哈
msg7086
2020-07-19 11:19:18 +08:00
我懂你的意思了。
你说的 DSL 是指设计了一个 DSL 然后用 Ruby 写了一个 Parser 。
我以为你说的是 Ruby DSL 编程方式。
Mark24
2020-07-19 11:44:51 +08:00
@msg7086 可以分享下你说的 Ruby DSL 的编程方式么? :D
msg7086
2020-07-19 12:29:25 +08:00
@Mark24 比如说用类似 pipeline 的语法设计一个类似 Rake 的 DSL 。

https://gist.github.com/msg7086/4d4f9c7d86fa6d32cc096b4a5374d654

然后类库里对涉及到的方法和运算符做重载。
比如这里主要是在类库里预定义了很多固定的操作,以及继承数组类并在上面重载了|运算符来实现串联依赖项。比如这里每项任务都会返回 Tasks 类,而 Tasks 类继承自 Array 类,存储各个步骤的依赖项列表。

稍微搜索一下应该能找到很多 Ruby DSL 设计的文章。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/691063

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX