question about sublists



On 1/4/07, Bill Wood <william.wood3 at comcast.net> wrote:

> Here's a bare-bones CL function definition:
>
>   (defun all-positions-if (items pred)
>     (do ((i 0 (1+ i))
>          (xs items (cdr xs))
>          (acc '() (if (funcall pred (car xs)) (cons i acc) acc)))
>         ((endp xs) (nreverse acc))))

Bill, thanks a lot for your help. I've modified the code as shown below.

(defun $sublist_indices (items pred)
  (let ((items (require-list items "$sublist_indices")))
    (do ((i 0 (1+ i))
         (xs items (cdr xs))
         (acc '() (if (definitely-so (mfuncall pred (car xs))) (cons
(1+ i) acc) acc)))
      ((endp xs) `((mlist) ,@(nreverse acc))))))

A user could paste this into a Maxima session via
to_lisp();
<paste>
(to-maxima)

or copy it to a file and load it via load(<filename>) .

Examples:

sublist_indices ([a, b, c, e, d, a, b, e, s, a, a], lambda ([x], x = a));
  => [1, 6, 10, 11]
sublist_indices ([a, b, c, e, d, a, b, e, s, a, a], lambda ([x], x = b));
  => [2, 7]
sublist_indices ([a, b, c, e, d, a, b, e, s, a, a], lambda ([x], x = b
or x = a));
  => [1, 2, 6, 7, 10, 11]
P(x) := not (x = a);
sublist_indices ([a, b, c, e, d, a, b, e, s, a, a], P);
  => [2, 3, 4, 5, 7, 8, 9]

best
Robert