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

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

这里有一个简单的例子:
Racket 代码:

#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 Scheme 中检查 Racket 的不可变列表。然而,可以在 Racket 中使用 Scheme 的可变列表(当然这并不是真正推荐的)。

#lang racket

(require compatibility/mlist
         "test2.ss")

(define a (mlist 1 2 3))
(b a)
这是 documentation for compatibility/mlist 的摘录:

尽管如此,如果您需要与 Scheme 代码进行交互,那可能是您唯一合理的选择。

关于list - Racket 列表与 r6rs 不兼容?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28973049/

10-13 06:57