I am trying to use remove to remove an item from a list and return the remainder of the list. I don't understand why this works: (let* ((;; my-button (intern (concatenate 'string "btn-" "b") ) ) (my-button btn-b) (list-buttons (list btn-a btn-b btn-z))) (setf (text notifications) (remove my-button list-buttons))) But this does not: (let* ((my-button (intern (concatenate 'string "btn-" "b") ) ) ;; (my-button btn-b) (list-buttons (list btn-a btn-b btn-z))) (setf (text notifications) (remove my-button list-buttons))) And neither does this: (let* ((my-button (intern (concatenate 'string "btn-" "b") (in-package :mypackagename) ) ) ;; (my-button btn-b) (list-buttons (list btn-a btn-b btn-z))) (setf (text notifications) (remove my-button list-buttons))) Isn't intern supposed to change the string into an object? The reason I am trying to use the second example is because I am trying to us the let form in a defun and pass in a letter (a, b, c .... z) and the construction btn-a, btn-b, etc. and then have remove do the check for equality, remove the item and return the sub-list. What am I not understanding?