请问下DSL,不是很懂

学clojure的时候接触到DSL,但是发现有关DSL的资料很少,只能知道他是为非专业人士设计,简化开发,使用s-表达式的一种技术。又知道DSL创建编辑器非常容易。

这里我想问,可不可以详细讲解一下DSL以及DSL的简单创建

DSL是Domain Specific Language, (不知道拼对没有)领域特定语言,简单来说就是一种语法,只用于某个特定情况。

对于Lisp来说,所有的宏所定义的东西,都可以算做是DSL。比方说,你想要一个html的字符串。

"<html><body><div>hello</div></body></html>"

但是你想用一种结格化的方式来表达,比如

[:html [:body [:div "hello"]]]

这就算是DSL。

为什么不是圆括号,这不lisp

楼主问的clojure, clojure里面有方括号表示vector, 其实elisp也有方框号啊。。

对了,你是god mode用户?

而且 html 本身也是一种广义上的 dsl

s-expression 和 DSL 没必然联系,只是恰好 有些 DSL 使用 s-expression 表示语法而已。DSL 是什么 Wikipedia 上讲的很清楚了,按字面意思理解就行了。标记语言 xml,html,markdown,css,unix 工具里 的 awk,数学工具 matlab,构建工具 make,cmake,maven,ant,gradle,webpack,这些都是了。

DSL 解决的领域特定问题,就是那种用“通用编程语言”也能解决,但是比较麻烦的问题。比如 Android 用 xml 构建 UI,实际上你也可以用 Google 提供的 Java API 来写。比如嫌弃 html,css 不够模块化,Facebook 发明了新的 DSL JSX。比如 make 作为 DSL 语法太怪异了,cmake 的就好很多。再比如 Bash 语法太怪异了,处理复杂运维任务的时候逐渐用 Python 了,后来发现 Python 提供的语言特性又太多了,大家只要提供一个DSL(配置文件),用 Python 去解析就行了。

再举例来说,构建 UI 的时候,我们发现“接口”,“多态”,“静态变量”,“内存分配”,这些通用编程语言的技术没啥用,我们只关心 UI 的复用,比如模块化,继承就很有用,模板语言一般会保留 “继承”,“循环”,“条件判断” 这些东西。所以像 jinja,vue,JSX 这些 DSL 保留了这些东西,去掉了其他的东西,让 DSL 保持简单又足够有用。

Lisp 所吹嘘的是,针对每个软件,Lisp 都能发明一种 DSL,比如使用宏,或者写内置解释器,内置编译器修改语法。甚至更夸张一点,好的软件工程师本质上都是在写各种各样的 DSL ,写各种各样的解释器,编译器。很多框架都是这么干的,比如 Vue,JSX。

是的,不过你跑题了……

CL的loop是DSL的经典例子:

http://www.gigamonkeys.com/book/loop-for-black-belts.html

emacs里可以用cl-loop体验:

1 个赞