• Re: Another code review perhaps?

    From B. Pym@Nobody447095@here-nor-there.org to comp.lang.lisp,comp.lang.scheme on Tue Jun 24 13:31:40 2025
    From Newsgroup: comp.lang.lisp

    B. Pym wrote:

    Arthur Lemmens wrote:

    Define iterative and recursive versions of a function that takes an object x and a vector v, and returns a list of all the objects that immediately precede x in v.

    Graham doesn't like LOOP, but I do. So here's a LOOP-version:

    (defun precedes (object vector)
    (loop for x across vector
    and i from 0
    when (and (equal x object) (> i 0))
    collect (elt vector (1-i))))


    Look at that:

    (1-i)

    Don't you think that that should be:

    (1- i)

    or

    (- i 1)

    ?

    It's shorter when you use a Lispy language instead of CL.

    Gauche Scheme

    (use srfi-42) ; list-ec

    (define (precedes obj vec)
    (list-ec (: x (index i) vec)
    (if (and (> i 0) (equal? x obj)))
    (ref vec (- i 1))))

    (precedes 5 #(5 0 4 5 8 9 5))
    ===>
    (4 9)

    Another way:

    (define (precedes o v)
    (let ((l (vector->list vec)))
    (filter-map
    (^(a b) (and (equal? o a) b))
    (cdr l)
    l)))

    Shorter:

    (use srfi-42) ;; list-ec
    (use gauche.sequence) ;; subseq

    (define (precedes obj vec)
    (list-ec (:parallel (: b (subseq vec 1)) (: a vec))
    (if (equal? b obj))
    a))

    (precedes '! #(! 0 ! 3 4 !))
    ===>
    (0 4)

    --- Synchronet 3.21d-Linux NewsLink 1.2