内部DSL往往只代表一系列特别的API及使用模式,例如LINQ查询语句及Ruby on Rails中的Active Record声明代码等。内部DSL可以使用一系列API来“伪装”成一种DSL,利用一些流畅化的技巧,例如像jQuery那样把一些方法通过“点”连接起来,而另一些也会利用元编程的方式。内部DSL还有一些优势,例如可以访问语言中的代码或变量,以及利用代码补全、重构等母语言的所有特性。
var result = from p in products where p.UnitPrice >= 20 group p by p.CategoryName into g orderby g.Count() descending select new { Name = g.Key, Count = g.Count() };
使用命令式编程语言写程序时,我们经常会编写如x = x + 1这样的语句,此时我们大量依赖的是可变状态,或者说是变量,它们的值可以随程序运行而改变,可变状态非常强大,但随之而来的便是“副作用”问题,例如一个无需参数的void方法,它会根据调用次数或是在哪个线程上进行调用对程序产生影响,它会改变程序内部的状态,从而影响之后的运行效果。而在函数式编程中则不会出现这个情况,因为所有的状态都是不可变的。事实上对函数式编程的讨论更像是数学、公式,而不是程序语句,如x = x + 1对于数学家来说,似乎只是个永不为真的表达式而已。