文档章节

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

redraiment
 redraiment
发布于 2016/01/31 19:44
字数 751
阅读 76
收藏 3

最近对《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的操作系统:把工作环境、测试环境、运行环境无缝地融合到了一起,真正可以随心所欲进行个性化定制的环境!

© 著作权归作者所有

共有 人打赏支持
redraiment

redraiment

粉丝 131
博文 23
码字总数 36572
作品 6
杭州
架构师
私信 提问
生活在REPL中(续):在REPL中动态加载依赖的库

在之前的文章《生活在REPL中:工具与程序一体》中,我描绘了把当做来使用的场景,在中做诸如访问数据库、加解密等日常开发工作。 但使用中最郁闷的就是依赖的类库无法动态加载。例如代码运行...

redraiment
2016/04/17
0
0
用于构建优秀命令行的 4 个 Python 库

在第二部分关于终端应用程序的系列文章中,我们将使用伟大的命令行界面来探索 Prompt Toolkit、Click、Pygment 和 Fuzzy Finder。 图片来源 : Mennonite Church USA Archives. 经Opensource....

oschina
2017/05/11
2.3K
2
Clojure 入门

我将尝试教一些人(主要是Python开发者,在OS X操作系统运行)如何使用Clojure, 因为我觉得目前已经存在的一些教人如何从零开始学习Clojure的文档不尽如人意。 当我自己在几个月前亲身经历这一...

oschina
2013/01/09
6K
13
Scala入门之工具篇

我初次接触Scala时,由于对Scala相关的工具不够熟悉,学习的效率低下。所以本文主要介绍Scala编程所必备的工具。一般而言,我们接触一门编程语言,都需要接触这门语言的编译器、REPL、构建工...

碎镜
2017/11/29
0
0
TPYBoard 获取MicroPython提示

REPL(交互式解释器)全称是 Read Evaluate Print Loop, pyboard 允许用户和 MicorPython 的交互式连接。使用REPL 是测试代码和运行指令的最易方式。使用 REPL 可以往 main.py 中增添脚本内...

bodasisiter
2016/08/22
2.2K
1

没有更多内容

加载失败,请刷新页面

加载更多

spring学习笔记(二)spring 事件的使用

spring 中的事件 spring事件通过订阅发布 可以解耦操作 可以同步 可以异步 步骤 编写事件 通过继承org.springframework.context.ApplicationEvent 来编写事件 public ApplicationEvent(Obj...

NotFound403
11分钟前
1
0
特斯拉车主成功破解了自己Model 3汽车

据汽车博客Electrek消息,一位特斯拉车主成功破解了自己Model 3汽车,还在此基础上运行了Ubuntu。 这位叫trsohmers的网友表示,“功劳大多要归到Ingineerix的头上,他花了数月才找到初始的那...

linuxCool
25分钟前
1
0
Gitbook : random errors when using gitbook plugin on running "gitbook serve"

在执行gitbook serve时,会有不定的失败错误 参考问题 :#1309 解决方案: 更新gitbook版本,这个问题似乎是3版本的问题 , 官方也不打算在这个版本解决了。 更新 到最新版本后, 不再出现问...

ol_O_O_lo
39分钟前
1
0
提灯照暗,向内自省——《中国文化的深层结构》读书笔记3800字

提灯照暗,向内自省——《中国文化的深层结构》读书笔记3800字: 作者:王健茜;断断续续一个多月才读完了《中国文化的深层结构》,这并不是一本难懂的书,之所以读得慢,源于对书中观点的思...

原创小博客
42分钟前
1
0
高德地图-行政区域接口

1、获取全国各省信息 https://restapi.amap.com/v3/config/district?extensions=all&key=应用Key&s=rsv3&output=json 2、获取下级行政区域信息 https://restapi.amap.com/v3/config/distric......

voole
54分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部