Жаль, я не могу комментировать ответ Оскара. Он разделяет список отрицательными числами вместо строк, поэтому он приводит к ошибке, как показано ниже (протестировано в схеме Petite Chez, заменяя first-> car, rest-> cdr, empty? -> null? В случае неправильного понимания ключевых слов ):
> (refactor '("Ben" 95 99 100 -1 "Bob" 90 -7 40 66 -5 "Jerry" 95 -5 90 0) '())
(("Ben" 95 99 100) ("Bob" 90) (40 66) ("Jerry" 95) (90 0))
Вот одно из решений. acc - это текущий подсписок, который начинается с последнего слова, после которого идут неотрицательные числа перед тем, как прикоснуться к следующему слову.
(define (refactor lst acc)
(cond ((null? lst) (list acc))
((and (not (number? (car lst))) (null? acc))
(refactor (cdr lst) (list (car lst))))
((and (not (number? (car lst))) (not (null? acc)))
(cons acc (refactor (cdr lst) (list (car lst)))))
((and (number? (car lst)) (< (car lst) 0)
(refactor (cdr lst) acc)))
(else (refactor (cdr lst) (append acc (list (car lst)))))))
Проверено, как показано ниже:
> (refactor '("Ben" 95 99 100 -1 "Bob" 90 -7 40 66 -5 "Jerry" 95 -5 90 0) '())
(("Ben" 95 99 100) ("Bob" 90 40 66) ("Jerry" 95 90 0))
> (refactor '("Ben" 95 99 100 -1 "Bob" 90 40 66 -5 "Jerry" 95 90 0) '())
(("Ben" 95 99 100) ("Bob" 90 40 66) ("Jerry" 95 90 0))
> (refactor '("Ben" 95 99 100 -1 "Bob" "Jerry" 95 90 0) '())
(("Ben" 95 99 100) ("Bob") ("Jerry" 95 90 0))
> (refactor '(-10 "Ben" -1 "Bob" -5 "Jerry" 0) '())
(("Ben") ("Bob") ("Jerry" 0))