V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
爱意满满的作品展示区。
Mark24

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

  •  2
     
  •   Mark24 ·
    Mark24Code · Jul 18, 2020 · 2529 views
    This topic created in 2119 days ago, the information mentioned may be changed or developed.

    背景

    刚学不久 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 replies    2020-07-19 12:29:25 +08:00
    Mark24
        1
    Mark24  
    OP
       Jul 18, 2020
    刚熟悉 Ruby 一周,目前功能比较简单。哈哈,后面有空再加。
    crella
        2
    crella  
       Jul 18, 2020   ❤️ 1
    路过,支持。顺便,本站讨论 Ruby 的帖子都不怎么热门。
    Mark24
        3
    Mark24  
    OP
       Jul 18, 2020 via Android
    @crella 🍻哈哈哈
    msg7086
        4
    msg7086  
       Jul 19, 2020 via Android
    可…这不是 DSL 啊…
    Mark24
        5
    Mark24  
    OP
       Jul 19, 2020
    @msg7086 哈哈,为啥不是?

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

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


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

    差不多呀。哈哈
    msg7086
        6
    msg7086  
       Jul 19, 2020
    我懂你的意思了。
    你说的 DSL 是指设计了一个 DSL 然后用 Ruby 写了一个 Parser 。
    我以为你说的是 Ruby DSL 编程方式。
    Mark24
        7
    Mark24  
    OP
       Jul 19, 2020
    @msg7086 可以分享下你说的 Ruby DSL 的编程方式么? :D
    msg7086
        8
    msg7086  
       Jul 19, 2020   ❤️ 1
    @Mark24 比如说用类似 pipeline 的语法设计一个类似 Rake 的 DSL 。

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

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

    稍微搜索一下应该能找到很多 Ruby DSL 设计的文章。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5681 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 62ms · UTC 07:41 · PVG 15:41 · LAX 00:41 · JFK 03:41
    ♥ Do have faith in what you're doing.