生活在REPL中,工具与程序一体

最近对《On Lisp》中提到的“自底向上程序设计”——经过改造语言来接近问题领域——有了新的体会:生活在REPL中,工具与程序一体。数据库

开发一个项目,除了用编辑器敲代码、编译器编译代码、命令行中运行等,总会用到许许多多辅助的开发工具。好比访问MySQL数据库用MySQL Workbench、访问MongoDB使用Robomongo,还有访问Redis、访问RESTful接口……每作一件事情都得有相应的辅助工具。服务器

常见的解决方案就是“IDE”:把这些工具都塞进一个盒子里。就像IntelliJ IDEA拥有Database、Terminal等一系列插件,几乎覆盖了开发经常使用的全部工具,但基本上仍是1+1=2的状况。数据结构

举个例子,要求从某些数据库中抓取数据并输出到文件中。因而先用MySQL客户端链接目标数据库,通过不断的调试和优化,终于写出能得到目标数据的SQL;但原始数据可能包含敏感信息,返回的结果是通过加密的数据,常见的MySQL客户端可没办法帮你调用解密程序;因此不得不本身编写代码处理,但为了避免干扰现有代码,决定另起一个新工程,因而数据库链接配置、加解密服务器配置……编辑器

就在我陷入反复造轮子没法自拔时,Lisp/Clojure给了我新的启示:函数

  1. 改造语言,让它更接近问题领域
  2. 写代码的入口是REPL,而不是编辑器

例如我如今维护的系统中,须要访问多台数据库服务器,所以须要一个客户端能灵活地在多台数据库之间快速切换,还能汇总获取的数据一并处理。因而我经过添加一系列自定义函数来加强Clojure,经过调用(db/all :dbname "SQL statement" argments...)在指定的数据库中获取数据,并组装成Clojure可直接操做的数据结构。工具

如今,通过我个性化定制的Clojure REPL就是个人工做环境,在其中能访问多台MySQL、访问Redis集群、访问MongoDB、调用外部RESTful服务、加解密数据……再遇到相似上面例子中的临时需求时,我直接在REPL中调试SQL,当调试完成时代码也就写完了,返回的结果可直接用Clojure处理并保存到文件,这一切浑然天成!开发工具

这让我想起了SmallTalk,假装成IDE的操做系统:把工做环境、测试环境、运行环境无缝地融合到了一块儿,真正能够为所欲为进行个性化定制的环境!测试

相关文章
相关标签/搜索