tbh I'm not sure why #acl2 doesn't have getf. Here is my "do-loop$" loopy one. #commonLisp
ACL2 !>(forgetf :a '(:c d :a b))
B
~
(defun forgetf (key plist)
(loop$ with pl of-type list = plist
do
(cond ((null pl) (return nil))
((equal key (car pl))
(return (cadr pl)))
(t (setq pl (cddr pl))))))