Scheme #!unspecific object 排序后出现

Scheme #!unspecific object appearing after sorting

我正在使用一个方案程序,在尝试使用我的排序功能时遇到了问题。我编写它是为了利用其他 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)))
        )
    )

)

当我用测试花名册调用排序函数时,我得到以下结果:

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

在您的 if 中,有 then 部分,但没有 else 部分,所以当 roster 为 null 时 returned 的值未指定:

(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)

roster 为 null 时,应该 sort return 什么?我猜是空列表。对于样式,我可能会将条件反转为:

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