我喜欢文本处理,以前热衷于使用数据库技术。现在用 Vim 和 Perl。 我可以不假思索的用 Vim 写 Perl 代码。像聊天一样。Perl 语言的所有特性我都熟悉,几乎不用查询帮助文档。 其他语言中关于文本处理,正则表达式的函数和算法,我都比较感兴趣。 拥有不同语法的语言,我也当成一种文本。
我越来越发现,每天处理的大都是语言本身造成的问题。 彼此之间有着语法和文化的鸿沟,互相之间充满了误解。
我决定写一个通用的语言解析算法,可以让不同的语言可以相互转换。
这是一个巨大的挑战,但不管多困难,都是值得的。
第一阶段. 我打算将 BNF 语言描述的语法作为配置文件进行解析,并生成相应的规则。
很快发现,太多的精力放在解析这门语言上,BNF 语系有太多的不同,难道我要用那么多精力,累死在做 BNF 的语言转换器的路上吗?
因为转换 BNF 到数据结构,只是时间上的问题,技术不是问题。何必浪费时间在这上面呢?一定有许多人可以把这个做的很好。
既然解析语言是为了转换成内部数据结构,我为什么不用表示数据结构的语言来做我的配置文件呢?
我决定用数据结构的表示形式来做配置文件。
进度加快了,但又遇到了问题,由于调试的问题,我需要在数据结构中加上暂停和注释的功能.
由于动态规则的问题,我需要对这个数据结构进行动态生成,而我的数据结构没有什么规则可言,不久,关键字和操作符也要加到这门语言当中,我突然意识到,我竟然在设计一门语言?
我曾经发过誓,不再发明什么新的语言,只是转换旧的。怎么违背了当初的誓言呢?
但能解决我问题的语言是什么呢?我列举了几个特性:
- 函数是第一类变量,可以传递函数名,动态的调用。
- 数据结构是动态生成的,而数据结构本身的字面量表示,就是一门语言。
- 配置语言本身就是一门完整的语言。
听闻 Lisp 就是这样的语言,但看看 Lisp 艰深的书籍和各种像机器码一样的程序,就从心里否定了继续研究 Lisp 的想法。
社区里很多人喜欢 Emacs, 时常看他们贴出 Elisp 的代码。这些表示法和 lisp 语言一样像一件古董。Lisp 除了能做 Emacs 的配置语言外,还能做什么呢?
《黑客和画家》改变了我的想法,原来 Lisp 可以做网络商店,而且开发效率那么高?这门语言真的那么神奇,难道 Lisp 真的就是我心里想要的那门语言吗?
通过使用函数和宏不断提高程序的抽象程度,用更精炼和直白的配置语言完成更高层次的开发需求。不管程序多复杂,只要正确的对函数进行命名,细致的设计宏,就能让我的配置文件始终简单易懂。
坚持使用函数编程范式,尽量不用有副作用和依赖全局变量的函数,除了迭代器之外。让系统的每一个组件都是单独可测试的。(迭代器就是做一次列表解析, 绝对没有副作用,是不可能的。)
经过多次的研读 Lisp 的书籍,我现在可以确认,是的,没错。Common Lisp 就是那个能帮助我实现理想的语言。唯有 Common Lisp 能满足我的要求。
来源:oschina
链接:https://my.oschina.net/u/563463/blog/158338