> I also fix nreverse doc-string not to mention its implementation
> details.

That the sequence is mutated is not an implementation detail. It is a
side effect that should be documented as part of the interface.

  (let ((lst '(1 2 3)))
    (message "Reversed: %s" (reverse lst))
    (message "Original: %s" lst)
    (message "NReversed: %s" (nreverse lst))
    (message "Original: %s" lst))
  ;; Output:
  ;; Reversed: (3 2 1)
  ;; Original: (1 2 3)
  ;; NReversed: (3 2 1)
  ;; Original: (1)

The user may well care about the difference.

> This would make nreverse and reverse symmetric.

  (let ((str "123"))
    (message "Reversed: %s" (reverse str))
    (message "Original: %s" str)
    (message "NReversed: %s" (nreverse str))
    (message "Original: %s" str))
  ;; Output:
  ;; Reversed: 321
  ;; Original: 123
  ;; NReversed: 321
  ;; Original: 123

This is not symmetrical to the lst example.