plist-get currently contains this code: FOR_EACH_TAIL_SAFE (tail) { tail = XCDR (tail); if (EQ (tail, li.tortoise)) break; } I don't understand why the last two lines are there. They're unnecessary for proper plists; for circular plists, they result in unintuitive behavior; and they depend on details of the FOR_EACH_TAIL_SAFE implementation. Can someone enlighten me? As a tangential issue, shouldn't `equal' be symmetric? (let* ((l1 '#1=(0 1 2 . #1#)) (l2 '(0 1 2 0 1 2 . #1#))) (equal l2 l1) => t (equal l1 l2) => "List contains a loop" error. (plist-get l2 1) => 2 (plist-get l1 1) => nil Patches attached.