14

我正在学习计划,直到现在一直在使用诡计。我真的只是在学习一种自学函数式编程语言的方法,但我想发布一个开源项目以加强这项研究——还不确定是什么......我是一名网络开发人员,所以可能是网状的。

很明显,发布方案代码并不是一件容易的事,因为所有这些不同的实现,而且除了语言本身的核心 (R5RS) 之外没有真正的标准。例如,我几乎肯定需要在磁盘上和通过 TCP 套接字进行基本 IO,以及字符串操作,例如扫描/正则表达式,这似乎没有被 R5RS 覆盖,除非我没有看到它在文档中。似乎 Scheme 更像是一种“概念”而不是实用语言……这是一个公平的评估吗?如果我想学习一种更适合在开源项目中使用的函数式编程语言,也许我应该看看 Haskell 之类的东西?

实际上,当您想要发布一个开源项目时,不同的方案实现会带来多大的痛苦?我真的不喜欢在各种主流实现(Chicken、guile、MIT、DrRacket)下维护 5 个不同的函数来处理基本的事情,比如字符串操作。有多少人真正为跨实现兼容性编写方案,而不是与只存在于他们自己方案中的库函数紧密耦合?

我已经阅读了http://www.ccs.neu.edu/home/dorai/scmxlate/scheme-boston/talk.html,这并没有让我充满信心;)

编辑 | 让我们将“标准”重新定义为“普通”。

4

4 回答 4

16

我相信在 Scheme 中,可移植性是一件傻事,因为 Scheme 实现的不同之处多于相似之处,并且没有其他实现试图模仿的单一实现(例如,与 Python 和 Ruby 不同)。

因此,Scheme 中的可移植性类似于使用软件渲染来编写游戏,“因为它位于 OpenGL 和 DirectX 之间的公共子集中”。换句话说,它是一个最小的公分母——它可以做到,但是您无法访问实现提供的许多功能。

出于这个原因,虽然 SRFI 通常具有可移植的参考实现(在可行的情况下),但其中一些伴随着注释,即高质量的 Scheme 实现应该定制库以使用特定于实现的特性,以便以最佳方式运行。

  • 一个典型的例子是case-lambdaSRFI 16);它可以被移植地实现,并且参考实现演示了它,但与内置的相比,它肯定不是最优的case-lambda,因为您必须在“用户”代码中实现函数调度。
  • 另一个例子stream-constant来自SRFI 41。参考实现使用循环列表的 O(n) 模拟来实现可移植性,但任何体面的实现都应该调整该函数以使用真正的循环列表,以便它是 O(1)。†</sup>

名单还在继续。Scheme 中的许多有用的东西是不可移植的——SRFI 有助于使更多的功能可移植,但 SRFI 不可能涵盖所有内容。如果您想有效地完成有用的工作,您很有可能必须使用非便携式功能。我认为,你能做的最好的事情就是编写一个外观来封装那些 SRFI 尚未涵盖的功能。

†</sup> 实际上现在有一种方法可以stream-constant以 O(1) 的方式实现而不使用循环列表。便携和快速的胜利!

于 2012-06-16T19:01:37.487 回答
10

困难的问题。

大多数人决定务实。如果实现之间的可移植性很重要,他们会在标准 Scheme 中编写大部分程序,并将非标准部分隔离在(小型)库中。有多种方法可以准确地做到这一点。最近的一项努力是 SnowFort。

http://snow.iro.umontreal.ca/

较早的努力是 SLIB。

http://people.csail.mit.edu/jaffer/SLIB

如果您查找 - 或要求 - 正则表达式和词法分析器/解析器的库,您会很快找到一些。

由于 R5RS 的理念是只包含所有实现者都同意的语言特性,因此标准很小 - 但也非常稳定。

然而,对于“现实世界”编程,R5RS 可能不是最合适的。因此 R6RS(和 R7RS?)包含更多“真实世界”的库。

也就是说,如果您只需要可移植性,因为它似乎是正确的事情,那么如果您真的想付出努力,请仔细重新考虑。我只会在我最了解的实现上编写我的程序。然后如果有必要之后移植它。这通常比预期的要容易。

于 2012-06-16T12:06:57.297 回答
10

我写了一个使用 Scheme 作为其实现语言的博客。因为我不想疏远任何特定 Scheme 实现的用户,所以我使用基于 R5RS 加上语法案例宏以及我的标准前奏的 Scheme 的受限方言编写. 对于我编写的算法程序,我认为这并没有过度限制,但您的需求可能会有所不同。如果您查看博客上的各种练习,您会发现我编写了自己的正则表达式匹配器,我已经完成了大量的字符串操作,并且我已经从互联网上抢走了文件wget(我使用 Chez Scheme——如果他们使用其他任何东西,用户必须提供他们自己的非便携式 shell 机制);我什至通过编写 ANSI 终端序列完成了一些有限的图形工作。

我会有点不同意 Jens。我发现从一开始就更容易构建可移植性,而不是事后移植。我以前不这么想,但我过去三年的经验表明它是有效的。

于 2012-06-16T13:16:37.323 回答
6

值得指出的是,现代 Scheme 实现本身是相当可移植的。您通常只需携带适当的方案即可将整个程序移植到新环境。不过,这对库程序员没有多大帮助,而这正是最新的 Scheme 定义 R7RS-small 的用武之地。它尚未广泛实施,但它提供了比 R5RS 更大的通用核心。

于 2014-01-10T03:27:10.977 回答