文档章节

生活在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

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

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

redraiment
2016/04/17
48
0
TPYBoard 获取MicroPython提示

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

bodasisiter
2016/08/22
2K
1
Scala入门之工具篇

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

碎镜
2017/11/29
0
0
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
强心针:Java在数据科学领域同样是王者!

  【IT168 评论】一直以来,Python和R语言都被认为是数据科学专属的两种语言,事实上它们并不是唯一可以用于数据科学的语言,Java同样可以用户数据科学。本文中,Aaron Lazar将列出10大理由...

it168网站
2017/12/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

1、Vue解决安卓4.4不兼容的问题

1.npm安装 npm install babel-polyfill--save-devnpm install es6-promise--save-dev package.json中会出现 "babel-polyfill": "^6.26.0","es6-promise": "^4.1.1", 2.main.js引入 impo......

阿K1225
10分钟前
0
0
mybatis generator 属性详解

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis......

太黑_thj
13分钟前
0
0
windows nvm 安装 node

nvm 是 node 的版本控制管理 下面是下载 nvm 的地址,选择 nvm-setup.zip 下载 https://github.com/coreybutler/nvm-windows/releases 就是下一步下一步,一键安装 基本命令有: nvm arch [32...

U_I_A_N
15分钟前
0
0
js判断字符串中是否包含某个字符串

indexOf() indexof()方法可以返回某个指定的字符串值在字符串中首次出现的位置。如果要检索的字符串值没有出现,则该方法返回-1。 var str = "123";console.log(str.indexOf("3") != -1);...

小星星_cjx
28分钟前
0
0
函数式组件完整例子

之前创建的组件是比较简单,没有管理或者监听任何传递给他的状态,也没有生命周期方法。它只是一个接收参数的函数。 在下面这个例子中,我们标记组件为 functional,这意味它是无状态 (没有响...

tianyawhl
30分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部