Scheme 编写可移植的方案代码。是什么;标准;超越R5R本身?

Scheme 编写可移植的方案代码。是什么;标准;超越R5R本身?,scheme,Scheme,我正在学习这个计划,到目前为止一直在使用诡计。我真的只是在学习函数式编程语言,但我想发布一个开源项目来重新推动这项研究-还不确定是什么。。。我是一名网络开发人员,所以可能是一些网络化的东西 很明显,发布scheme代码并不容易,因为有所有这些不同的实现,而且除了语言本身的核心(R5R)之外没有真正的标准。例如,我几乎肯定需要在磁盘上和TCP套接字上执行基本IO,以及字符串操作,如扫描/regex,这似乎不在R5R中涵盖,除非我在文档中没有看到它。似乎Scheme更多的是一个“概念”,而不是一种实

我正在学习这个计划,到目前为止一直在使用诡计。我真的只是在学习函数式编程语言,但我想发布一个开源项目来重新推动这项研究-还不确定是什么。。。我是一名网络开发人员,所以可能是一些网络化的东西

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

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

我读过,但这并没有让我充满信心;)

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

难题

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

旧的努力是徒劳的

如果您查找或询问正则表达式库和lexer/parser,您很快就会找到一些

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

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

这就是说,如果你只需要便携性,因为它似乎是正确的事情,然后重新考虑,如果你真的想把努力。 我只需在我最熟悉的实现上编写我的程序。然后,如有必要,在之后对其进行移植。这通常比预期的要简单。

我编写了一个使用Scheme作为实现语言的程序。因为我不想疏远Scheme的任何特定实现的用户,所以我使用Scheme的受限方言编写,该方言基于R5RS加语法case宏和my。我不觉得这对我编写的算法程序有太大的限制,但是你的需求可能会有所不同。如果你看一下博客上的各种练习,你会发现我写了自己的正则表达式匹配器,我做了大量的字符串操作,我通过向wget(我使用Chez方案——如果用户使用其他任何东西,他们必须提供自己的不可移植的shell机制)从互联网上获取文件;我甚至通过编写ANSI终端序列完成了一些有限的图形工作


我不同意詹斯的观点。我发现从一开始就构建可移植性比事后移植更容易。我以前不这么认为,但我在过去三年的经验表明它是有效的。

我认为在Scheme中,可移植性是一件傻事,因为Scheme实现的差异比相似的要大,并且没有其他实现试图模仿的单一实现(例如,与Python和Ruby不同)

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

因此,虽然SRFI通常有一个可移植的参考实现(在实际情况下),但其中一些还附带了一个注释,即质量方案实现应定制库,以使用实现特定的功能,从而实现最佳功能

  • 一个主要的例子是
    case lambda
    ();它可以移植实现,参考实现对此进行了演示,但与内置的
    case lambda
    相比,它显然不太理想,因为您必须在“用户”代码中实现函数分派
  • 另一个例子是
    stream constant
    from。参考实现使用循环列表的O(n)模拟以实现可移植性,但任何合适的实现都应该调整该函数以使用真正的循环列表,使其为O(1)。†
这个列表还有很多。Scheme中很多有用的东西都不是可移植的。SRFI有助于使更多的功能可移植,但SRFI不可能涵盖所有内容。如果你想高效地完成有用的工作,很有可能你必须使用不可移植的功能。我认为,你能做的最好的事情就是编写一个封装这些功能的外观e SRFI尚未涵盖的功能


†实际上根本不使用循环列表。可移植且快速,以获得成功!

值得指出的是,现代方案实施本身具有相当的可移植性;您通常只需携带适当的方案,就可以将整个程序移植到新环境中。不过,这对库程序员没有多大帮助这就是R7RS小型化的最新方案定义