【问题标题】:Dr Racket, R5RS and SRFIRacket 博士、R5RS 和 SRFI
【发布时间】:2012-07-04 19:45:46
【问题描述】:

每当我尝试在 drracket r5rs 语言中使用像 foldreduce 这样的 srfi/1 函数时,我都会得到一个空列表?错误。经过一些研究,我发现这是由于函数需要和不可变列表但得到一个可变列表的事实。如何在 r5rs 中创建不可变列表,或者这个 srfi/1 设计时没有考虑到 r5rs?

【问题讨论】:

  • 我不认为我的评论值得完整的“回答”状态,但我鼓励您尝试常规的“#lang 球拍”语言,除非您出于某些特殊原因使用 r5rs简单的想要接近语言标准的愿望。
  • 我使用它严格是为了好玩,所以我决定坚持使用 r5rs,这样我就可以在脑海中感觉到我理解了该语言的整个概念。

标签: scheme racket


【解决方案1】:

这基本上是在重申约翰所说的话,但它绝对确实值得一个完整的答案状态。 (约翰,如果您逐字复制此答案,我会很乐意删除它...)

关于 Racket 的 R5RS 语言的事情是它非常严格地坚持 R5RS 语言,因此除此之外什么都没有。 (也可以为 R5RS 可变对实现 SRFI,但没有人想出适应的代码。)

无论如何,这里的底线是 R5RS 基本上只在极少数情况下有用很多有用的东西。因此,特别是如果您想感受一下这门语言,您可能会想玩各种超出狭窄 r5rs 世界的东西——为此您应该使用#lang racket

就“只是了解语言”而言,它也更好,您甚至可以将相同的课程应用于其他 Scheme 实现,但要记住它们都带有自己的扩展。如果您使用有限的 r5rs 语言,您可能会体验到这种有限语言带来的挫败感,这很容易压倒您在其他情况下可能获得的任何积极体验。

【讨论】:

    【解决方案2】:

    由于“球拍”语言使用了不可变的 cons 单元,系统自带的 srfi/1 实现也使用了不可变的 cons 单元。

    由于 R5RS 中的 cons 单元使用可变的 cons 单元,因此您不能将内置的 srfi/1 与 DrRacket 中的 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。

    【讨论】:

      猜你喜欢
      • 2018-11-07
      • 2023-03-26
      • 2015-07-21
      • 1970-01-01
      • 1970-01-01
      • 2013-02-05
      • 2017-01-22
      • 2014-11-25
      • 1970-01-01
      相关资源
      最近更新 更多