Scheme#!排序后出现的非特定对象

时间:2016-04-08 20:54:04

标签: sorting functional-programming scheme

我正在使用计划程序,并在尝试使用我的排序功能时遇到了问题。我已经编写了它来使用其他2个辅助函数,我已经测试过并且可以按预期确认工作,但是在排序时,我会收到一个附加了#!unspecific对象的正确列表。我不确定这个对象是如何创建的,或者如何避免这种副作用。

这些功能的代码如下:

(define sort
    (lambda (roster)
        (if (not (null? roster))
            (cons (smallest roster (car roster)) (sort (remove roster     (smallest roster (car roster)))))
        )
    )
)

(define smallest
    (lambda (roster item)
        (cond 
            ((null? roster) item)
            ((< (string->number (car (car roster))) (string->number (car item))) (smallest (cdr roster) (car roster)))
            (else (smallest (cdr roster) item))
        )
    )
)

(define remove
    (lambda (roster record)
        (cond 
            ((null? roster) '())
            ((equal? (car roster) record) (cdr roster))
            (else (cons (car roster) (remove (cdr roster) record)))
        )
    )

当我使用测试名单调用sort函数时,我得到以下结果:

(("1" "Anon" "89") ("2" "Student" "90") ("3" "Test" "78") . #!unspecific)

1 个答案:

答案 0 :(得分:4)

if 中,有然后部分,但没有 else 部分,因此名单时返回的值 is null未指定:

(if (not (null? roster))
    (cons (smallest roster (car roster))
          (sort (remove roster (smallest roster (car roster)))))
    ;; nothing here
    )

要确认,请尝试类似

的内容
(cons 1 (if #t 'then))

你应该看到像

这样的东西
(1 . #!unspecific)

名单为空时 排序会返回什么?我猜这个空名单。对于风格,我可能会将条件反转为:

(if (null? roster)
    roster            ; or '()
    (cons ...))