每当我尝试使用srfi/1函数,如、折叠、和,减少,在drracket r5rs语言中,我会得到一个空列表吗?错误。经过一些研究,我发现,这是因为函数需要和不变的列表,但得到一个可变的列表。如何在r5rs中创建不可变列表,还是这个srfi/1没有考虑到r5rs?
发布于 2012-07-06 13:48:55
这基本上是重复约翰的话,但它确实值得一个完整的回答地位。(约翰,如果你逐字复制这个答案,我很乐意删除这个.)
关于Racket的R5RS语言的问题是,它非常严格地坚持只使用R5RS语言,因此除了这个语言之外什么都没有。(SRFI也可以为R5RS可变对实现,但从来没有人想出经过修改的代码。)
无论如何,这里的底线是,R5RS基本上只有在一些罕见的情况下才有用,在这种情况下,您只想给自己带来使用基本的r5rs语言的痛苦--这意味着您基本上不能做很多有用的事情。所以,特别是如果你想对语言有一种感觉,你可能会想玩各种超越狭窄的r5rs世界的东西--为此,你应该使用#lang racket。
它在“只是摸索语言”方面也更好,您甚至可以将同样的经验应用到其他Scheme实现中,记住它们都带有自己的扩展。如果您使用有限的r5rs语言,您可能会体验到这种有限的语言所带来的挫折,这很容易压倒您可能对它有任何积极的体验。
发布于 2012-07-04 21:09:50
由于语言"racket“使用不变的cons单元格,系统附带的srfi/1实现也使用不可变的cons单元格。
由于R5RS中的cons单元使用可变的cons单元格,所以不能使用内置的srfi/1和R5RS语言在DrRacket中。
然而,这是一个小问题。下载http://srfi.schemers.org/srfi-1/srfi-1-reference.scm并将其保存在有代码的目录中。
打开它并插入第一行:
(define (check-arg . more) #t)然后在您自己的代码中,添加以下一行:
(load "srfi-1-reference.scm")现在srfi/1重新定义了map (和其他几个)。重新定义的内置操作通常只在意外情况下执行,因此DrRacket中的默认设置是抛出错误。因此,单击R5RS语言在DrRacket的左下角。选择“选择语言”。然后单击“显示详细信息”按钮。删除滴答“不允许重新定义初始绑定”。
现在运行以下程序:
(load "srfi-1-reference.scm")
(fold + 0 '(1 2 3))按预期生产6台。
https://stackoverflow.com/questions/11334697
复制相似问题