新年第一篇: 给LISP新手介绍下SLIME这个神器

新年第一篇: 给LISP新手介绍下SLIME这个神器

Posted on  2013/01/04  by  Albert Lee

好久没给自己的blog浇水了. 昨晚写的一些东西也是首先发布在douban的LISP小组里,冷落了自家的blog,罪过啊, 贴回来.
初次发布的douban小组帖子地址

假期抽空看了些SLIME的文档和源代码,随便写点感受,主要给LISP的初学者看的,因为这些对老鸟们来说都是老生长谈了。下面内容有些杂乱,主要是自己的学习笔记。

*SLIME 是一个革命性的开发工具*。它的重要性将在未来几年内逐渐被主流开发界所认识(主流总是很迟钝)。任何其他编程语言,如果不能实现SLIME的功能,则不能称之为“高级语言”。

SLIME是: The Superior Lisp Interaction Mode for Emacs 的缩写。
SLIME 的官方网站: http://common-lisp.net/project/slime/
各种文档,介绍在上述网站中都有。这个网站看上去很out。但,不要被外表欺骗。它里面的开发技术与理念非常的领先前卫。

SLIME是 Emacs 与 Common LISP之间的桥梁,是开发环境与运行环境之间的桥梁。

我个人认为SLIME最重要的一点意义在于:它强调了快速迭代式的开发方式。首先要了解这一点,然后SLIME的各种特性都是为这一点服务的。这其实一直是LISP的开发方式。

SLIME支持远程开发与热升级,之前在我的blog上写过一篇文章介绍: http://www.feime.net/lisp%E5%88%A9%E5%99%A8/%E8%BF%9C%E7%A8%8B%E5%BC%80%E5%8F%91%E8%B0%83%E8%AF%95%E4%B8%8Ehot-update/

SLIME的特性包括:
0. Emacs 的slime-mode 包括了lisp代码的编辑支持,代码执行,编译,宏展开,等等
1. 在线文档
2. REPL
3. 交叉引用
4. 调试
5. Inspector
等等。。

===================
SLIME 与 Emacs, LISP 之间的关系,可以通过下图表示:


SLIME架构图

swank 是LISP下的server,emacs中的slime模块通过tcp连接上swank服务器。使用者在emacs中编写代码,发送命令,通过网络传递给lisp进程执行,然后返回结果。

比如,最典型的:我们在emacs中编写了一段函数,然后调用 slime-compile-defun 命令(一般用快捷键 C-c C-c) , 这段函数的代码就会发送给lisp进程,lisp进程最终调用compile命令将代码编译到进程内部,并返回执行结果,emacs获得结果显示。

注意,我们可以重复定义一个函数,可以定义新的函数,而LISP进程是一直在那里的。你可以随时去执行任意的命令或函数。你可以将一大坨测试数据(甚至真实数据)load到LISP的进程中,然后随便折腾他们。
甚至,你可以连接上一个远程运行的服务程序,修改里面的函数定义,或增加新的功能,而不用重启这个进程。这就是远程调试和热升级。

======================
下面演示一些 SLIME 的特性:注意,这些特性很多在LISP环境下都可以直接做到,例如宏展开,反汇编,调试等等,使用SLIME只是更方便而已。这里不严格区分是SLIME的功能还是LISP的功能,众所周知,SLIME自古以来就是LISP不可分割的一部分了,是LISP的固有领土。

0. 想一边写代码,一边测试运行?
没错,SLIME就是这么用的。

SLIME REPL

1. 想获得更详细的在线文档?
当我写下一个函数时,在emacs下面的minibuffer里会有一个简单的文档:


文档功能1

但是,我不满足,想看看更详细的文档怎么办?用 slime-hyperspec-look 命令,我绑定到快捷键上了,一键即可在浏览器上打开详细的文档。

2. 我想看一段代码编译后的汇编代码?
用 slime-dissassemble-definition

3. 想知道一个函数被谁引用过?
slime-list-callers

xref

4. 想知道一行宏调用展开后是啥德行么?
slime-macroexpand-1 (all)


macroexpand

5. 查看对象内部的值?
slime-inspect

Inspect Object

想知道一个package的信息?
inspect package 即可

注意,里面列出的内容是可以点击的,回车可以看到更详细的信息,比如我们想知道那1个 external symbols 是什么:

Inspect Package, show details

这里 flags 中的 f 表示这个符号是个函数。

===============
未完, 后面还有 SLDB , 调试是个大头.

This entry was posted in  LISPUncategorized and tagged  EmacslispSlime. Bookmark the permalink.

2 Responses to 新年第一篇: 给LISP新手介绍下SLIME这个神器

  1. says:

    学习LISP中,现在用的都是本地的LISP,没有用过远程的。
    看了文章,我的理解是LISP本身就提供了这种功能,支持在程序运行时插入新的函数(做到热补丁),修改函数定义(热升级)。而SLIME则起一个桥梁作用。
    不过还有疑问:
    1、反复定义函数,那LISP运行环境是不是只接受最后一次定义?
    2、如果LISP程序正在运行,这时候重新定义了函数,那到底用哪个函数呢?新定义的还是以前的?
    3、除了LISP,还有其他支持这种远程调试和热升级的语言吗?我感觉编译型的应该都不支持吧。那python、lua呢?

    • Albert Lee  says:

      是的. SLIME就是起了桥梁作用, LISP系统一直就是支持热升级的.
      其实在LISP中写程序就是扩展LISP的运行环境, 用户定义的函数与系统提供的函数是同等的地位.
      反复定义的函数, 会记录最后一个.如果函数正在运行,则不受影响, 当下次再调用时, 会调用新的函数.除了LISP, 还有 Smalltalk 与 LISP的方式很相似(都基于 Image) , 另外 Erlang 也可以热升级.
      python通过一些手段也可以实现类似的效果, 但似乎很少这么做.

转载于:https://my.oschina.net/freeblues/blog/102851

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值