Making functions private to a function has the same purpose as using local variables: they don't get to float around in namespaces without reason.
I use many localized functions. Especially for dialogs, as Kerry mentioned. Why have specialized functions that deals with tiles hanging around if there are no tiles to deal with? Also, instead of writing lengthy lambda's in the code, I often use localized functions in mapcar's and apply's.
As Mark points out, the local declaration makes all the difference. Try not to localize it and inspect it after loading first time:
(defun add2 (/ rn)
(defun fun (n) (+ n 100))
(if
(setq rn (getreal "\nEnter a number: "))
(fun rn)
)
)
_$ fun
nil
_$ add2
#<USUBR @049e2af0 ADD2>
_$ (add2)
103.0
_$ fun
#<USUBR @049e2a14 FUN>
After first execution of ADD2 it gets loaded into the heap and stays there. If it's localized it's put on the stack and gets carried out with the garbage after execution. Clean, easy, effective.