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