Может, кто-нибудь знает, почему в Scheme (и в Racket) не приянто использовать set!, особенно в списках
Например, если мне надо список разделить на два по «выполняется/не выполняется условие», то в CL это будет выглядеть как
(defun split (list pred)
(let ((res1 nil) (res2 nil))
(dolist (l list)
(if (pred l)
(push l res1)
(push l res2)))
(values (nreverse res1) (nreverse res2))))
На Scheme полный аналог
(define (split list pred)
(let ([res1 null] [res2 null])
(for-each (lambda (l)
(if (pred l)
(set! res1 (cons l res1))
(set! res2 (cons l res2))))
list)
(values (reverse res1) (reverse res2))))
Но в учебниках по Scheme пишут, что так писать очень плохо, а надо так:
(define (split list pred)
(define (loop list res1 res2)
(cond
[(null? list) (values (reverse res1) (reverse res2))]
[else
(if (pred (car list))
(loop (cdr list) (cons (car list) res1) res2)
(loop (cdr list) res1 (cons (car list) res1)))]))
(loop list null null))
Помогите понять, в чём смысл?