V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
Mark24
V2EX  ›  分享创造

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

  •  2
     
  •   Mark24 ·
    Mark24Code · 2020-07-18 09:55:32 +08:00 · 2165 次点击
    这是一个创建于 1621 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景

    刚学不久 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
    
    

    输出

    8 条回复    2020-07-19 12:29:25 +08:00
    Mark24
        1
    Mark24  
    OP
       2020-07-18 15:53:45 +08:00
    刚熟悉 Ruby 一周,目前功能比较简单。哈哈,后面有空再加。
    crella
        2
    crella  
       2020-07-18 17:28:41 +08:00   ❤️ 1
    路过,支持。顺便,本站讨论 Ruby 的帖子都不怎么热门。
    Mark24
        3
    Mark24  
    OP
       2020-07-18 20:29:05 +08:00 via Android
    @crella 🍻哈哈哈
    msg7086
        4
    msg7086  
       2020-07-19 01:06:27 +08:00 via Android
    可…这不是 DSL 啊…
    Mark24
        5
    Mark24  
    OP
       2020-07-19 10:22:32 +08:00
    @msg7086 哈哈,为啥不是?

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

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


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

    差不多呀。哈哈
    msg7086
        6
    msg7086  
       2020-07-19 11:19:18 +08:00
    我懂你的意思了。
    你说的 DSL 是指设计了一个 DSL 然后用 Ruby 写了一个 Parser 。
    我以为你说的是 Ruby DSL 编程方式。
    Mark24
        7
    Mark24  
    OP
       2020-07-19 11:44:51 +08:00
    @msg7086 可以分享下你说的 Ruby DSL 的编程方式么? :D
    msg7086
        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 设计的文章。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1045 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 76ms · UTC 19:22 · PVG 03:22 · LAX 11:22 · JFK 14:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.