我一直想知道如何正确使用REPL编写可重用代码,而不是一次性实验。对REPL风格的各种优势有很强的看法,我想在实践中检查一下,但我不明白预期的工作流程是什么。
假设我在REPL中打开现有模块(+示例/测试数据),并以交互方式创建新功能/修复错误。非常成功 - 它现在按照预期使foobar frobnicates!但现在呢?我怎么能把更改和添加回到我的模块和版本控制中?
将所有REPL状态转储到文件只能用于初始创建,而不能用于修改或添加现有代码(因此,几乎所有开发) - 它需要保留诸如模块,注释等之间的分割等内容。从REPL历史记录到每个文件中的相关位置进行复制似乎是繁琐的工作并且非常容易出错。如何确保修改后的函数具有我在REPL中的最终版本,并且我没有忘记一些?
建议的最佳做法是什么?
恕我直言,这个问题与语言无关,但如果不是,那就让我们假设Haskell或Python,因为Lisp是一个自己的世界,我对它不够熟悉。
答案 0 :(得分:4)
REPL不适用于持久性代码开发。 REPL的主要用途是:
有一些例外情况,例如带有 LOAD 的行编辑器和基于Microsoft的解释性BASIC的 SAVE 操作,这些操作在1970年代后期很流行&# 39; s和1980年代早期。然而,这实际上是早期微型计算机提供的组件,它没有基于更高级文件系统的开发环境所需的存储,容量和操作系统功能。
另一个例外是各种操作系统命令shell REPL环境(如bash)的已保存历史记录和别名功能。在这种情况下,解释语言虽然很重要,但却是管理文件系统和执行系统二进制文件的辅助语言。用户代码在这些环境中的可重用性适用于平台的管理和日常操作。
对于使用高级持久性编程概念(如模块化和版本控制),建议使用解释器工具集提供的基于文件系统的编程工具。大多数开发语言都有单元测试框架,例如用于Haskell的HUnit和用于Python的unittest,它们允许在应用程序开发过程中执行组件级测试和操作检查。
所有这些都说明了,如果使用正确的语言和实现,可以打破这种范式并创建一个REPL环境,通过用户提供的小代码示例构建更大,更复杂的东西。