使用排序! DrRacket中的功能

时间:2014-11-26 20:02:30

标签: scheme racket

我处理向量并尝试使用列出heresort!函数。但是我得到了未绑定的标识符错误。在编辑器的顶部,我将语言指定为

 #lang scheme

我应该加载另一个模块才能使用此功能吗?

4 个答案:

答案 0 :(得分:3)

参考文档适用于MIT Scheme,您使用的是带有#lang scheme语言的Racket。请改用sort程序,它返回一个新的排序列表:

(define lst1 '(3 2 1 0))
(define lst2 (sort lst1 <))

lst1
=> '(3 2 1 0)

lst2
=> '(0 1 2 3)

如果您需要在排序后修改输入列表,请使用:

(define lst1 '(3 2 1 0))
(set! lst1 (sort lst1 <))

lst1
=> '(0 1 2 3)

答案 1 :(得分:2)

您链接的文档适用于mit-scheme而非Racket。 Racket的文档在这里:http://docs.racket-lang.org/search/index.html?q=sort

请注意,#lang方案中的方案并不意味着R5RS或R6RS,而是意味着 “MzScheme语言”。如今大多数人都使用#lang球拍。

#lang scheme
(require rnrs/sorting-6)

(define v (vector 5 3 2))
(vector-sort! < v)
v

如果您想将R6RS与Racket一起使用,请举例如下:

#!r6rs
(import (rnrs lists (6))
        (rnrs base (6))
        (rnrs io simple (6)))
(display (find even? '(3 1 4 1 5 9)))

答案 2 :(得分:1)

使用句法扩展名定义您自己的sort!

(define-syntax-rule (sort! lst p ...)
  (set! lst (sort lst p ...)))

然后

> (define lst1 '(3 2 1 0))
> (sort! lst1 <)
> lst1
(0 1 2 3)

答案 3 :(得分:0)

DrRacket(或者只是在CLI中的球拍)是一种多语言实现。最奇怪的是,#lang scheme(或只是#!scheme)根本不遵循Scheme标准,而是R5RS兼容一次的语言的遗留名称,但已将其名称更改为{{ 1}}并且具有不可变对作为标准。

使用可变对的球拍程序支持的其他语言是#!racket#!r5rs。这些遵循Scheme标准,如果您使用这些,您也可以编译和运行您的程序与其他实现。只需将第一行更改为,即表示该文件的其余部分将以该语言编程。 R6RS有#!r6rs而R5RS需要SRFI-95 sort libraryvector-sort支持

PS:如果您关注的是SICP,您可能会对sort!感兴趣。 See here if you need help getting it to work