每当我尝试在drracket r5rs语言中使用srfi / 1函数(如 fold 和 reduce )时,我会得到一个空列表?错误。经过一些研究后,我发现它是由于函数需要和不可变列表但得到一个可变的列表。如何在r5rs中创建不可变列表,或者这个srfi / 1是不是为r5rs而设计的?
答案 0 :(得分:3)
这基本上重申了约翰所说的,但它确实确实值得一个完整的答案状态。 (约翰,如果你逐字复制这个答案,我会很高兴删除这个......)
关于Racket的R5RS语言的问题在于它非常严格地仅仅依赖于R5RS语言,因此除此之外什么都没有。 (SRFI也可以用于R5RS可变对,但没有人提出改编的代码。)
在任何情况下,这里的底线是R5RS基本上只适用于那些你想要使用基本的r5rs语言给自己造成痛苦的极少数情况 - 这意味着你基本上不能做非常有用的东西。所以特别是如果你想要了解这种语言,你可能会想要使用超越狭隘世界的各种事物 - 为此你应该使用#lang racket
。
在“只是学习语言”方面也更好,你甚至可以将相同的课程应用到其他Scheme实现中,同时记住它们都有自己的扩展。如果你使用有限的r5rs语言,你可能会遇到这种有限语言带来的挫败感,这很容易让你无法体验到任何积极的体验。
答案 1 :(得分:0)
由于语言“racket”使用不可变的cons单元格,系统附带的srfi / 1实现也使用不可变的cons单元格。
由于R5RS中的cons单元使用可变缺点单元格,因此不能在DrRacket中使用内置srfi / 1和R5RS语言。
然而这是一个小问题。 下载http://srfi.schemers.org/srfi-1/srfi-1-reference.scm并将其保存在您拥有代码的目录中。
打开它并插入第一行:
(define (check-arg . more) #t)
然后在您自己的代码中添加以下行:
(load "srfi-1-reference.scm")
现在srfi / 1重新定义了地图(以及其他一些地图)。 重新定义的内置操作通常只能完成 在意外,所以DrRacket中的默认设置 是扔错误。因此,请单击R5RS语言 在DrRacket的左下角。选择“选择语言...”。 然后单击“显示详细信息”按钮。删除勾号 通过“禁止重新定义初始绑定”。
现在运行以下程序:
(load "srfi-1-reference.scm")
(fold + 0 '(1 2 3))
并按预期产生6个。