您的Lisp工作流程是什么样的?[关闭]


39

我现在正在学习Lisp,它来自于机车BASIC-> Z80汇编器-> Pascal-> C-> Perl-> C#-> Ruby的语言发展。我的方法是同时:

  • 使用SBCL,QuickLisp,closure-html和drakma编写简单的网络抓取工具
  • 观看SICP讲座

我认为这运作良好;我正在开发好的“ Lisp护目镜”,因为我现在可以相当轻松地阅读Lisp。我也对Lisp生态系统的工作方式有所了解,例如Quicklisp的依赖关系。

不过,我真正想念的是对经验丰富的Lisper实际工作方式的感觉。

当我为.NET编码时,我已经使用ReSharper和VisualSVN设置了Visual Studio。我编写测试,实现,重构,提交。然后,当我做完足够的事情来完成一个故事时,我会写一些AUAT。然后,我在TeamCity上发布了Release版本,以将新功能推向客户进行测试和希望的批准。如果它是需要安装程序的应用程序,那么我会使用WiX或InnoSetup,显然是通过CI系统构建安装程序。

因此,我的问题是:作为一名经验丰富的Lisper,您的工作流程是什么样的?您主要在REPL还是在编辑器中工作?您如何进行单元测试?持续集成?打包和部署?当您坐在办公桌前时,一边蒸着一杯咖啡,一边蒸着装裱着约翰·麦卡锡(John McCarthy)的照片,那又是什么呢?

目前,我觉得我正在掌握Lisp编码,但没有掌握Lisp开发...


2
这个问题似乎不合时宜,因为它是一项民意测验,并且很可能会吸引无法为该网站提供持久价值的答案。

Answers:


13

假设您不想为Allegro或LispWorks之类的商业实现付费,comp.lang.lisp和Lisp论坛上的大多数人都建议将Emacs和SLIME结合使用。SLIME视频说明了工作过程。我使用Emacs和SLIME在家中开发个人程序,并且这种组合非常有效。

SLIME使您可以在Emacs和REPL之间进行集成。我通常要做的是加载所有文件,然后在Emacs中打开正在处理的文件。输入或更改每个功能后,按C-x C-e,将在REPL中执行功能定义。然后,我可以切换到REPL缓冲区并尝试该功能。REPL的所有历史记录都可以使用标准Emacs按键序列进行编辑,因此可以轻松地重做具有不同参数的函数调用。


4

我主要与Clojure合作,这是我的设置:

  1. Eclipse IDE(我使用它是因为我也做很多Java工作,有时与Clojure在同一项目中)
  2. Clojure的逆时针插件(包括REPL)
  3. 依赖和构建管理的Maven
  4. Egit用于源代码控制

编码时的工作流程通常是这样的:

  1. 打开一个REPL,加载所有当前的源文件
  2. 在REPL中进行编码和测试
  3. 当我对某些代码满意时,将其复制/粘贴回源文件中
  4. 偶尔重新启动REPL(或者当我无法挽回地破坏了名称空间时,或者只是为了检查源文件中的所有内容是否仍在工作时)
  5. 还要在源文件中编写测试,每个Maven版本都会自动运行这些测试。有时候,我在REPL上所做的非正式测试会直接变成单元测试。
  6. 此时提交等-几乎是常规的开发工作流程

总体而言,它与常规Java / C#工作流程没有太大区别,除了在开发过程中更交互地使用REPL。


也许您可以提到nrepl + emacs:据我所知,它提供的环境更类似于史莱姆。
Giorgio 2013年

4

为了补充其他答案,我结合了“认真思考问题,然后写下解决方案”这种开发方式和“从一个副本开始,然后反复构建程序”的风格。它通常在中间。我要做的是从我希望程序看起来的总体思路开始,然后我开始编写它,试图在不断发展的过程中获得有关问题领域的新知识,以修改我的方法。在实践中,这意味着我做了很多实验并编写了很多废除代码。我尝试了不同的方法,并且可以非常快速地切换方向。Lisp对于这种开发很有用。这就是为什么我不太喜欢TDD的原因,为了有效地进行TDD,我必须先知道要做什么。

我尝试做的另一件重要事情是更多地考虑程序不同部分之间的协议。与其他OO语言不同,在Common Lisp中,CLOS更加关注泛型函数的概念,IOW方法位于类之外,它们是开发的重点。有时,我只是从定义我想要的协议的一组GF开始,我编写了一个简单的实现,并使用它充实了协议,然后再编写真正的实现。假设我正在写一个存储大量博客文章的层,我可能有一组GF来定义如何创建,编辑和搜索博客文章,并且我将编写一个简单的实现,将博客文章保存在内存中的列表中,对协议感到满意之后,我编写了一个实现,可以将博客文章保存到数据库中,或将其写到文件中。

当您知道当前的解决方案不是最优的,而我试图在此方面最大化时,Lisp可以很容易地改变方向并采取不同的方法。

同样重要的一点:充分利用您的环境,了解使用不同的编译设置来通过更多调试信息来编译代码,并利用既可以编译又可以解释lisp的事实。使用诸如MOP之类的lisps内省工具,使用史莱姆功能来查找文档,使用检查器来查看对象内部,定期查阅hyperspec,将您的系统更像是OS,而不是代码的静态编译器,这要多得多比那强大。

对于初学者来说,lisp并不是python和ruby的胜利,但是随着您对python和ruby的了解越来越多,您会在较小的环境中赢得巨大的胜利。

最重要的是,您必须有乐趣并喜欢这种语言,有时它只是为了易于劝阻并使用当前流行的blub语言。如果您坚持使用Lisp,它将偿还您的款项。


2

我倾向于在与REPL有联系的编辑器中工作(通常是在emacs中进行编辑,并使用SLIME作为通向Common Lisp环境的桥梁)。我倾向于从“底部”和“顶部”开始,朝着中间方向工作,并在进行时修改设计。

至于测试,这就是我拥有REPL的原因。我发现它可以帮助我随时测试代码。有时,我会写一些正式的测试或基准测试(通常是在优化阶段)。具有较慢的,已知良好的功能实现,在优化的版本中进行实验(在编辑器窗口中),将其发送至底层的Lisp代码,并检查其速度是否较快,并返回与较慢的结果相同的结果码。

就打包而言,我有一些实用程序代码可以帮助我打包可安装ASDF的项目,将它们拍到下载存储库中并进行版本控制。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.