List 与r6rs不兼容的球拍列表?
我正在写一个程序,在这个程序中我必须重用我的一位教授的代码。我的程序是用Racket编写的,我想重用的代码是用r6rs编写的 当我想测试我的程序时,它总是失败。 这是因为我调用了一个以列表(racketlist)作为参数的过程,但该过程在R6RS文件中。在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
(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)