• Re: (loop initially ... getting non-ANSI CL warning

    From B. Pym@21:1/5 to Ken Tilton on Wed Aug 7 07:53:18 2024
    Ken Tilton wrote:

    Mirko.Vukovic@gmail.com wrote:
    Hi,

    I am still in a bit of shock that my first loop attempt works, with
    one legalistic exception.

    This is my simple code to show duplicates in a list:

    (defun show-duplicates (list)
    (loop
    initially with ref = (first list)

    That is a blank initially clause. CLisp is being nice and coping with
    that and pretending you just wrote (loop with ref = (first list)....

    for entry in (rest list) do
    (if (equal ref entry)
    (print entry))

    Using when when when is suitable makes code more readable.

    (setf ref entry)))

    Loop is pretty powerful so you should have a nervous feeling when you
    find yourself setfing key iteration variables.

    It looks as if you are assuming a sorted list and simply printing out elements the same as the preceding element:

    (loop for (a b) on list
    when (eql a b)
    do (print b))

    You get an extra iteration on the last element and nil so an input list
    of '(nil nil) would print an extra duplicate. If that is a problem you can:

    (loop for a in list
    for b in (cdr list) ; this will run out first and halt the loop
    when (eql a b)
    do (print b))

    (setq list '(0 0 0 2 3 4 4 5 6 6 6))

    (loop for a in list
    for b in (cdr list) ; this will run out first and halt the loop
    when (eql a b)
    do (print b))

    0
    0
    4
    6
    6


    newLISP

    (setq lst '(0 0 0 2 3 4 4 5 6 6 6))

    (apply (fn (a b)(if (= a b) (println a)) b) lst 2)

    0
    0
    4
    6
    6

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)