in-vector
because you want to set the values of the vector, correct?access
for yourself using the existing extension facilities of iterate
.Great! Could you explain how to write the access clause using the existing extension facilities of Iterate? I couldn't find this feature in the documentation. I didn't find any ideas while reading the iterate.lisp code either, unless I add `with-symbol-macro` to iterate.
iterate
without a lot of thought about how it interacts with other features, a very detailed implementation plan, etc.I'm not sure if I'm missing something here. You don't want
in-vector
because you want to set the values of the vector, correct?You can already do something very much like this with
(iter (for x in-vector *my-vector* with-index i) (incf (aref *my-vector* i) 10))
I think you could probably add
access
for yourself using the existing extension facilities ofiterate
. I would be reluctant to see this added to the core version ofiterate
without a lot of thought about how it interacts with other features, a very detailed implementation plan, etc.ITERATE is a very core piece of code for those who use it, and only to be messed with after very deep thought, especially for things that are easy to implement on top of it.
On 5 Aug 2025, at 11:44, Felecarp wrote:
Hello all,
I am a newcomer in lisp. I hope the mailling list is a right channel to write this.
I imaginated a feature for iterate. A built-in clause that inserts a symbol-macro in iterate output. It seems useful to me because symbol-macros are elegant setf-able places.
Here is a clause named
ACCESS var IN-VECTOR v
with a symbol macro for var.(defparameter *my-vector* (make-array 8 :initial-contents (iter (for i from 1 to 8) (collect i))) (print *my-vector*) #(1 2 3 4 5 6 7 8) (iter (access i in-vector *my-vector*) (incf i 10)) (print *my-vector*) #(11 12 13 14 15 16 17 18)
The clause would be writen like this :
(defmacro-clause (ACCESS var IN-VECTOR v) "Access the elements of a vector" (let ((vect (gensym)) (end (gensym)) (index (gensym))) ‘(progn (with ,vect = ,v) (with ,end = (array-dimension ,vect 0)) (for ,index from 0 to (1- ,end)) (with-symbol-macro ,var (aref ,vect ,index)))))
I see no way to implement it without modifications in the iterate macro. But I think this can be implemented inserting a
symbol-macrolet ,(nreverse *symbol-macro-bindings*)
just afterlet* ,(nreverse *bindings*)
in the iterate macro output.I would like to try to implement it.
My questions :
- Are they existing approaches to get the same result in iterate ?
- Does some common lisp iteration systems already provides this feature in their built-ins clauses or in the extension mechanism ?
- Does someone already tried to implement this kind of feature in iterate ?
- What are the contributing guidelines on the common lisp gitlab repository ? I plan to imitate the current symbol naming, comment and commit style ; and writing the corresponding unit tests.