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

d11*_*wtq 13 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,这并不能让我满怀信心;)

编辑| 让我们将"标准"重新定义为"共同".

Chr*_*ung 15

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

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

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

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

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

实际上现在有一种方法以stream-constantO(1)方式实现而根本不使用循环列表.便携而快速的胜利!


soe*_*ard 9

困难的问题.

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

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

较旧的努力是SLIB.

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

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

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

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

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


use*_*810 9

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

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


Joh*_*wan 6

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