List 与r6rs不兼容的球拍列表?

List 与r6rs不兼容的球拍列表?,list,scheme,racket,r6rs,List,Scheme,Racket,R6rs,我正在写一个程序,在这个程序中我必须重用我的一位教授的代码。我的程序是用Racket编写的,我想重用的代码是用r6rs编写的 当我想测试我的程序时,它总是失败。 这是因为我调用了一个以列表(racketlist)作为参数的过程,但该过程在R6RS文件中。在R6RS文件中有(assert(list?argument)),这是始终false 这里有一个简单的例子: 球拍代码: #lang racket (require "test2.ss") (define a (list 1 2 3)) (b

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

当我想测试我的程序时,它总是失败。 这是因为我调用了一个以列表(racketlist)作为参数的过程,但该过程在R6RS文件中。在R6RS文件中有
(assert(list?argument))
,这是始终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文件中的
列表?
测试始终为false。。。即使我将一个新创建的列表作为参数传递,如上面的示例所示

如何执行与上述示例相同的操作,以使
列表?
测试结果为真

谢谢你的帮助


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

球拍对与方案对不同,因为球拍对是不可变的,而方案对不是

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

以下是一段摘录自:

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

不鼓励在现代球拍编码中使用可变列表。相反,考虑使用列表。


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

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

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

#lang racket

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

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

因为您的库是用
编写的!r6rs
,您需要将其移植到
#!racket
模块或您的主程序可以用
#编写!r6rs
,您可以按原样使用库。第三个选项是使可变列表传递给库函数,并将其转换回but或ban列表,但我发现这个选项有点不太理想

要完成完整的
#!r6rs
您需要按照以下方式安装库:

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

#!r6rs
(import (rnrs)
        (test))

(define a (list 1 2 3))
(b a) ; #<void> (and prints stuff to stdout)
#!r6rs
(进口(rnrs)
(测试)
(定义a(列表1 2 3))
(b)a);#(并将内容打印到标准输出)

在DrRacket中点击[运行]并查看魔术

Racket对是不可变的,Scheme对不是,因此存在差异。事实上,Scheme中是否存在另一个测试,当在不可变列表上测试时,该测试结果为真?因为我找不到。。
#!r6rs
(import (rnrs)
        (test))

(define a (list 1 2 3))
(b a) ; #<void> (and prints stuff to stdout)