3

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

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

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

#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 测试,但我找到了另一种解决问题的方法(通过将可变列表传递给过程)。

4

3 回答 3

3

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

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

#lang racket

(require compatibility/mlist
         "test2.ss")

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

这是以下文档compatibility/mlist的摘录:

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

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

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

于 2015-03-10T20:12:07.043 回答
2

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

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

#lang racket

 (define (b a)
   (display "a is : ") (display a) (newline)
   (display "list? : ") (display (list? a)) (newline)))
于 2015-03-10T20:27:06.750 回答
2

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

由于您的库#!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-03-10T20:38:39.210 回答