My programs have defects because some functions destroy or mutate shared data. I avoid mutating shared data in Common Lisp; for example, I use CONS. However, I made a mistake by using SORT, which wasn't aware that SORT is destructive. Sometimes I still forget that SORT mutates its input data. The function sort-snode below sorts a part of a tree.
(defun sort-snode (snode attr)
(flet ((key-fn (r)
(cdr (assoc attr r))))
(sort snode #'< :key #'key-fn)))
Since it is based on SORT, it changes the input data, which is snode. After I found the output tree didn't look what I expected, I took days to see where my mistake was.
My workaround is running COPY-LIST before SORT, as shown below.
(defun sort-snode (snode attr)
(flet ((key-fn (r)
(cdr (assoc attr r))))
(sort (copy-list snode) #'< :key #'key-fn)))
In brief, if you are new to Common Lisp, please beware of destructive operations, which is not limited to SORT. It can be NCONC.
Top comments (0)