(下)高级元编程指南:创建一个Ruby DSL

原文请见Creating a Ruby DSL: A Guide to Advanced Metaprogramming

精简语法

当前的实现还有最后一个地方让人揪心——在配置代码块里不得不重复配置每一行。恰如其分的DSL都应知道,配置代码块里的所有东西将在配置对象的上下文内执行,并且这样可以实现同样的效果:

MyApp.configure do  
  app_id "my_app"
  title "My App"
  cookie_name "my_app_session"
end  

来,撸起袖子继续加油干!从表面上看,需要做两件事。首先,需要一种方式来执行在配置对象上下文内传递给configure的代码块,以便在代码块的方法调用作用于那个对象。其次,要修改访问器方法,以便做到有一个参数时就写入该值、没有参数时就读取。一个可能的实现是:

module Configurable  
  def self.with(*attrs)
    not_provided = Object.new

    config_class = Class.new do

继续阅读»»»

(上)高级元编程指南:创建一个Ruby DSL

原文请见Creating a Ruby DSL: A Guide to Advanced Metaprogramming

领域特定语言(DSL)是一个强大到令人难以置信的工具,因为它把编写或者配置复杂的系统变得更为简单。同时它们无处不在——作为一名软件工程师,你很可能在日常事务中使用了多种不同的DSL。

在这篇文章,你将会学习到什么是领域特定语言,什么时候应该使用它们,以及如何使用Ruby的高级元编程技术创建你自己专属的DSL。

此文章基于Nikola Todorovic发布在Toptal博客上关于Ruby元编程的介绍,如果你是初次接触元编程,请先阅读一下那篇文章。

什么是领域特定语言?

对于DSL的普遍定义是,它们是某一特定应用域或用例的专门语言。这意味着,你只能在指定的方面使用DSL——它们不适合普遍目的的软件开发。如果这听起来有点虚,是因为——DSL本来就千奇百怪。以下是一些重要的分类:

  • 标记性语言,例如HTML和CSS设计用于描述类似结构、内容、网站页面风格这些指定的事物。标记性语言不能用于编写任何算法,所以它们适合DSL的描述。

  • 在某


继续阅读»»»

Scala:一种统治DSL的语言(II)

/**
 * 谨献给我最爱的Yoyo
 *
 * 原文出处:https://scalerablog.wordpress.com/2016/05/30/scala-one-language-to-rule-them-all-ii/
 * @author dogstar.huang <chanzonghuang@gmail.com> 2017-02-10
 */

你不会让一个门外汉来控制全新的380空中客车。如此一个强大的工具要求使用它的人员是有经过培训的;当Scala用于铸造新的能量环时,我的意思是,领域特定语言,Scala也类似是这样。经过前面的一些理论和大量动手的学习(learning by doing)我们已经掌握了一些理论,现在是时候通过从头开始构造一个DSL来进一步学习。

我们领域特定语言的目标

我们全新的DSL打算用于服务教学练习。然而,除了这个目的这外,它还需要有一个目标。那就是(或者是其中一个):

  • 一个治理的过程或系统。
  • 作为另一种语言的代理。

在我们的示例里,将采用第二种。

AWK简介

你是在开玩笑吗?这还需要介绍吗


继续阅读»»»

Scala:一种统治DSL的语言(I)

/**
 * 谨献给我最爱的Yoyo
 *
 * 原文出处:https://scalerablog.wordpress.com/2016/04/18/scala-one-language-to-rule-them-all-i/
 * @author dogstar.huang <chanzonghuang@gmail.com> 2017-02-07
 */

一开始,没有编程语言,只有机器代码。通过铸造能量环(即:编程语言)来统治机器,自动化编程拯救了我们所有人。他们多元化,启发了新的语言,构成了一个富生态系统。在它们中间涌现了一种高度有用的计算机语言:领域特定语言。

领域特定语言(DSL)

领域特定(计算机)语言已经存在有一段很长的时间了。对于这种语言,学术界的描述宣称它们是中心化的并且用于某一特定应用领域。领域特定语言简单而又简练,这意味着在描述动作、实体和应用领域内的关系过程中,它们会引导用户。更为重要的是,为了适配目标而制作它们。

如果我是从事统计研究的,为什么需要担心内存管理?

一点也不惊讶的是,这些迷你语言的整个王国已经进化并且接手了


继续阅读»»»

声明式编程:它是一个真实的东西?

/**
 * 谨献给Yoyo
 *
 * 原文出处:https://www.toptal.com/software/declarative-programming
 * @author dogstar.huang <chanzonghuang@gmail.com> 2016-05-15
 */

目前,声明式编程是诸如数据库,模板和配置管理这样广泛而多样领域的主导范式。

简而言之,声明式编程由需要指导一个程序需要做什么,而不是告诉它如何做到组成。在实践中,这种方法需要提供一个用于表达用户想要什么,并通过屏蔽底层结构(循环,条件,任务)实现期望的最终状态的领域特定语言(DSL)。

虽然这种模式在其必要的地方是有着显著的改善,但我主张,声明式编程有明显的局限性,此限制我会在本文中进行探讨。此外,我建议双管齐下,既抓住声明式编程的好处,同时又取代其局限性。

警告这篇文章是多年来个人在声明工具中奋斗的结果。许多我在这里的说法都是没有彻底证明的,有的甚至基于事实价值。一个适当的、批评的声明式编程会花费大量的时间,精力,并且我要回到过去使用很多这样的工具;我的心是


继续阅读»»»