Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 7601969
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 30, 20262026-05-30T23:17:37+00:00 2026-05-30T23:17:37+00:00

I want to iterate over a list, perform an action with the elements and

  • 0

I want to iterate over a list, perform an action with the elements and based on some criteria, I want to get rid of the active element. However, when using the function below I end up in an infinite loop.

 (defun foo (list action test)
   (do ((elt (car list) (car list)))
       ((null list))
     (funcall action elt)
     (when (funcall test elt)
       (delete elt list))))

(setq list '(1 2 3 4))
(foo list #'pprint #'oddp)
-> infinite loop

Is it not possible as it points to itself? In the end, elt is (car list) of course.

Is this a correct assessment? And how could I solve this efficiently?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-30T23:17:39+00:00Added an answer on May 30, 2026 at 11:17 pm

    Actually you can alter the state of your list while iterating over it. You will just have to use rplacd in addition to delete, and control the advancement along the list not in the iteration clause, but inside the do body:

     (defun nfoo (lst action test)
       (do* ((list (cons 1 lst))
             (elt (cadr list) (cadr list)))
            ((null (cdr list))
             (if (funcall test (car lst)) (cdr lst) lst))
         (funcall action elt)
         (if (funcall test elt)
           (rplacd list (delete elt (cddr list)))
           (setf list (cdr list)))))  
    

    You should call it via copy-list if you don’t want it to destroy the argument list.

    If you want to remove from your list not all elements equal to elt that passed the test, but rather all such that will pass the test, then the delete call will need to be passed the test function as the :test argument.

    (edit:) and even much simpler and straightforward, like this (non-destructive) version:

    (defun foo (list action test)
       (do* ((elt (car list) (car list)))
            ((null list))
         (funcall action elt)
         (if (funcall test elt)
           (setf list (delete elt list))
           (setf list (cdr list)))))
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I want to filter elements from a list of lists, and iterate over the
I want to iterate over a list of DOM elements (check boxes) and keep
I want to remove all elements from a list I want to iterate over
I want to iterate over my list and do something with multiple elements, not
The problem is easy, I want to iterate over each element of the list
I want to iterate over everything in a list except the first few elements,
I want to iterate over a sequence in xquery and grab 2 elements at
I've got a List collection and I want to iterate over it in a
Say I've got a list and I want to iterate over the first n
When you want to iterate sequentially over a list of numbers you will write:

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.