球拍列表与 r6rs 不兼容?

Racket lists incompatible with r6rs?

我正在编写一个程序,其中我必须重用我的一位教授的代码。我的程序是用 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 对,因为 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 的摘录:

This compatibility/mlist library provides support for mutable lists. Support is provided primarily to help porting Lisp/Scheme code to Racket.

Use of mutable lists for modern Racket code is strongly discouraged. Instead, consider using lists.

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

这只是 Alexis King 回答的补充(代码示例不能在评论中)。由于 r6rs 语言(在 Racket 中实现)使用可变列表,并且所有 racket 库都需要不可变列表,因此您不能按原样重用 r6rs 代码。重用代码的最快方法是将其移植到 #lang racket 语言。

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

#lang racket

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

当你说你的代码是用 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 中点击 [运行],看看魔法!