文档章节

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

redraiment
 redraiment
发布于 2016/01/31 19:44
字数 751
阅读 73
收藏 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

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

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

redraiment
2016/04/17
0
0
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
2K
1
follow大神教程——实践java爬虫之一

学习http://blog.csdn.net/pleasecallmewhy/article/details/17594303 抓取搜狗首页logo 运行结果: http://www.sogou.com/images/logo/new/sogou.png sogou审查元素中有这句<img src="http:......

realsa
2014/06/30
0
0
修复 MySQL 主从复制错误的 Python 小工具--mysql_repl_repair

mysqlreplrepair mysqlreplrepair.py是一款用于修复mysql主从复制错误的python小工具,该工具可以修复由于主从数据不一致导致的1062(duplicate key), 1032(key not found)错误。当遇到复制出...

dukope
2017/09/06
94
0

没有更多内容

加载失败,请刷新页面

加载更多

python中cv2模块imread函数

导入 >> import cv2>> import numpy as np 读图片 >> image_arr = cv2.imread('file_path') 灰度图扩展成彩色图 可以通过图片的channel判断是否是灰度图。如果需要可以将灰度图扩展到RGB......

温子寒
6分钟前
0
0
利用剪切板JS API优化输入框的粘贴体验

直接复制记录下 /**@description 表单输入框粘贴体验优化,出处https://www.zhangxinxu.com/wordpress/?p=8003@author zhangxinxu*/// 遍历所有的输入框[].slice.call(document.qu...

红羊在厦门
13分钟前
0
0
awk复习

10月22日任务 复习 awk调用外部变量 -v参数设置内部变量调用外部变量 [root@castiel-Lu awk]# a=44[root@castiel-Lu awk]# echo "ABCD" | awk -v GET_A=$a '{print GET_A}'44 更复杂的...

robertt15
19分钟前
0
0
2018CTF大赛学习

1.C伪随机数,可预测,可用来做加密解密,如 int main() { // This program will create same sequence of // random numbers on every program run for(int i = 0; ......

simpower
27分钟前
0
0
XamarinEssentials教程移除键值首选项的键值

XamarinEssentials教程移除键值首选项的键值 如果开发者不再使用首选项中的某一项时,可以将该项移除掉。此时可以使用Preferences类的Remove()方法,该方法可以将存在于首选项中的指定键以及...

大学霸
34分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部