cl-loop macro implement an equivalent to the
continue keyword of other languages?
The behavior of
break can be achieved by using
while clauses by placing them in the middle of
(cl-loop item in '(1 2 3 4) do (print item) until (= 3 item) do (print item))
will be roughly equivalent to Python code
for item in [1, 2, 3, 4]: print(item) if item == 3: break print(item)
However, I cannot identify any clause, that says "abort this iteration step, continue with the next", like the
continue keyword would do. Is there such a clause?
Let's say I want to do something for every string in a list. From the string I want to derive a file-name, and if it exists, collect data about those files.
(defconst mylist '(1 2 "hello" 3 "world" 4)) (defconst mylist-file-data (cl-loop for prefix in mylist unless (stringp prefix) continue for file-name = (concat prefix ".txt") unless (file-exists-p file-name) continue for attributes = (file-attributes file-name) for mtime = (file-attribute-modification-time attributes) for size = (file-attribute-size attributes) collect (list file-name mtime size)))
By contrast, without a
continue clause I cannot use
for clauses to define variables, that can only be defined when the condition is fulfilled. Instead I need to reformulate the loop more awkwardly, e.g. as
(defconst mylist-file-data (cl-loop for prefix in mylist for file-name = (if (stringp prefix) (concat prefix ".txt")) for attributes = (if (file-exists-p file-name) (file-attributes file-name)) for mtime = (if attributes (file-attribute-modification-time attributes)) for size = (if attributes (file-attribute-size attributes)) if attributes collect (list file-name mtime size)))
Note how all
(if ...)s are executed for each iteration step, even when the first already decides that the step could be skipped.