刚学不久 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
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
1
Mark24 OP 刚熟悉 Ruby 一周,目前功能比较简单。哈哈,后面有空再加。
|
2
crella 2020-07-18 17:28:41 +08:00 1
路过,支持。顺便,本站讨论 Ruby 的帖子都不怎么热门。
|
4
msg7086 2020-07-19 01:06:27 +08:00 via Android
可…这不是 DSL 啊…
|
5
Mark24 OP @msg7086 哈哈,为啥不是?
DSL 也分,内部和外部 DSL 。这个实现了是以来 Ruby 去实现的,没有大动干戈去做编译器什么的。 Ruby 也鼓励构建这种内部 DSL 。 一方面可以导入 gem 包传给他解决,在 ruby 里调用它。 另一方面,我觉得额外实现比较好,我自己本地实现了一个读取只写内容的文件,直接转出结果。只看文件本身就是 DSL 。翻译并构建的 Ruby 脚本看起来就像是编译器。 差不多呀。哈哈 |
6
msg7086 2020-07-19 11:19:18 +08:00
我懂你的意思了。
你说的 DSL 是指设计了一个 DSL 然后用 Ruby 写了一个 Parser 。 我以为你说的是 Ruby DSL 编程方式。 |
8
msg7086 2020-07-19 12:29:25 +08:00 1
@Mark24 比如说用类似 pipeline 的语法设计一个类似 Rake 的 DSL 。
https://gist.github.com/msg7086/4d4f9c7d86fa6d32cc096b4a5374d654 然后类库里对涉及到的方法和运算符做重载。 比如这里主要是在类库里预定义了很多固定的操作,以及继承数组类并在上面重载了|运算符来实现串联依赖项。比如这里每项任务都会返回 Tasks 类,而 Tasks 类继承自 Array 类,存储各个步骤的依赖项列表。 稍微搜索一下应该能找到很多 Ruby DSL 设计的文章。 |