Может, кто-нибудь знает, почему в 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))
Помогите понять, в чём смысл?







