我正在使用计划程序,并在尝试使用我的排序功能时遇到了问题。我已经编写了它来使用其他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)
答案 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 ...))