编写便携式方案代码。除了R5RS本身有什么“标准”吗?

时间:2012-06-16 09:37:59

标签: scheme

我正在学习计划,直到现在一直在使用诡计。我真的只是学习一种教自己一种函数式编程语言的方法,但是我想发布某种类型的开源项目来重新加强研究 - 不知道到底是什么......我是一名网络开发人员,所以可能是webby。

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

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

我已阅读http://www.ccs.neu.edu/home/dorai/scmxlate/scheme-boston/talk.html,但这并不能让我满怀信心;)

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

4 个答案:

答案 0 :(得分:15)

我相信Scheme中的,可移植性是一个愚蠢的差事,因为Scheme实现与它们相似的更加不同,并且没有其他实现尝试模拟的单一实现(与Python和Ruby不同) ,例如)。

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

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

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

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

实际上now a way to implement stream-constant in an O(1) fashion根本没有使用循环列表。便携而快速的胜利!

答案 1 :(得分:9)

难题。

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

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

较早的努力是SLIB。

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

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

由于R5RS的哲学仅包括所有实现者都同意的那些语言特征,因此标准很小 - 但也非常稳定。

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

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

答案 2 :(得分:9)

我编写了一个使用Scheme作为其实现语言的blog。因为我不想疏远Scheme的任何特定实现的用户,所以我使用基于R5RS加上语法案例宏加上我的Standard Prelude的Scheme的限制方言来编写。我没有发现对我编写的算法程序过于严格,但您的需求可能会有所不同。如果你看一下博客上的各种练习,你会看到我编写了自己的正则表达式匹配器,我已经完成了相当多的字符串操作,并且我已经通过炮轰来从互联网上抢夺文件wget(我使用Chez Scheme - 用户必须提供自己的非便携式shell机制,如果他们使用其他任何东西);我甚至通过编写ANSI终端序列完成了一些有限的图形工作。

我和Jens略有不同意见。我发现从一开始就更容易构建可移植性,而不是之后移植。我并没有这么想,但我过去三年的经验表明它有效。

答案 3 :(得分:6)

值得指出的是,现代的Scheme实现本身相当便携;您通常可以通过引入适当的Scheme来将整个程序移植到新环境中。然而,这对图书馆程序员来说并没有多大帮助,而R7RS-small是最新的Scheme定义。它尚未广泛实现,但它提供了比R5RS更大的共同核心。