【问题标题】:Racket lists incompatible with r6rs?球拍列表与 r6rs 不兼容?
【发布时间】:2015-05-12 10:35:58
【问题描述】:

我正在编写一个程序,我必须在其中重用我的一位教授的代码。我的程序是用 Racket 编写的,而我想重用的代码是用 r6rs 编写的。

当我想测试我的程序时,它总是失败。 这是因为我调用了一个以列表(球拍列表)为参数的过程,但该过程位于 R6RS 文件中。在 R6RS 文件中有 (assert (list? argument)) ,这是 always false...

这里是一个简单的例子: 球拍代码:

#lang racket
(require "test2.ss")

(define a (list 1 2 3))
(b a)

R6RS 代码:

#!r6rs

(library 
 (test)
 (export b)
 (import (rnrs base (6))
         (rnrs control (6))
         (rnrs lists (6))
         (rnrs io simple (6)))

 (define (b a)
   (display "a is : ") (display a) (newline)
   (display "list? : ") (display (list? a)) (newline)))

R6RS 文件中的list? 测试始终为假...即使我像上面的示例一样将新创建的列表作为参数传递。

我怎样才能像上面的例子一样做,以便list? 测试结果为真。

感谢您的帮助!

编辑:我在不可变列表上找不到结果为 true 的 r6rs 测试,但我找到了另一种解决问题的方法(通过将可变列表传递给过程)。

【问题讨论】:

  • Racket 对是不可变的,Scheme 对不是,因此存在差异。
  • 确实,Scheme 中是否存在另一个测试,当在不可变列表上测试时结果为真?因为找不到..

标签: list scheme racket r6rs


【解决方案1】:

Racket 对与 Scheme 对不同,因为 Racket 对是不可变的,而 Scheme 对不是。

据我所知,没有办法在纯 RnRS 方案中检查 Racket 的不可变列表。但是,可以在 Racket 中使用 Scheme 的可变列表(当然,这并不是真正推荐的)。

#lang racket

(require compatibility/mlist
         "test2.ss")

(define a (mlist 1 2 3))
(b a)

这是documentation for compatibility/mlist的摘录:

这个compatibility/mlist 库提供对可变列表的支持。提供支持主要是为了帮助将 Lisp/Scheme 代码移植到 Racket。

强烈不鼓励在现代 Racket 代码中使用可变列表。相反,请考虑使用列表。

不过,如果您需要与 Scheme 代码交互,那可能是您唯一合理的选择。

【讨论】:

    【解决方案2】:

    这只是 Alexis King 答案的附录(代码示例不能在 cmets 中)。由于 r6rs 语言(在 Racket 中实现)使用可变列表,并且所有球拍库都期望不可变列表,因此您不能按原样重用 r6rs 代码。重用代码的最快方法是将其移植到#lang racket 语言。

    更改语言,删除 import 语句,然后一次修复每个错误。

    #lang racket
    
     (define (b a)
       (display "a is : ") (display a) (newline)
       (display "list? : ") (display (list? a)) (newline)))
    

    【讨论】:

      【解决方案3】:

      当你说你的代码是用 Racket 编写的。您是指 Racket,软件,还是 #!racket,Racket(软件)支持的多种兼容语言之一?

      由于您的库是用#!r6rs 编写的,因此您需要将其移植到#!racket 模块,或者您的主程序可以用#!r6rs 编写,您可以按原样使用该库。第三种选择是制作可变列表以传递给库函数并转换回但或禁止列表全部一起,但我发现这个选项有些次优。

      要完成完整的#!r6rs,你需要像这样安装你的库:

      plt-r6rs --force --install ./test.sls
      

      我假设test.sls 在当前目录中。你会得到确认。您无需重新启动 DrRacket。 (不需要强制,但它会覆盖早期版本。)然后您只需将代码更改为 Scheme 代码:

      #!r6rs
      (import (rnrs)
              (test))
      
      (define a (list 1 2 3))
      (b a) ; #<void> (and prints stuff to stdout)
      

      在 DrRacket 中点击 [Run],看看魔法!

      【讨论】:

        猜你喜欢
        • 2015-06-10
        • 1970-01-01
        • 1970-01-01
        • 2019-10-29
        • 2022-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多