# Pastebin aXK1SAG2 (defmacro with-cpring5 ((vec idx &optional suffix) &body body) "Inside BODY expose two SETF-able symbol-macros: @5q[-SUFFIX] ≡ (aref VEC IDX) @5phi[-SUFFIX] ≡ (aref VEC (1+ IDX)) Supply SUFFIX (a symbol or string) when you need distinct names while nesting several WITH-CPRING5 forms." (let* ((pkg *package*) (tail (if suffix (format nil "-~A" suffix) "")) (qsym (intern (concatenate 'string "@5Q" tail) pkg)) (psym (intern (concatenate 'string "@5PHI" tail) pkg)) (v (gensym "VEC-")) (i (gensym "IDX-"))) `(let ((,v ,vec) (,i ,idx)) (symbol-macrolet ((,qsym (aref ,v ,i)) (,psym (aref ,v (1+ ,i)))) ,@body)))) (let ((v (make-array 10 :element-type 'double-float :initial-element 0d0))) (with-cpring5 (v 2 outer) (with-cpring5 (v 4 inner) (setf @5q-outer 1d0 @5phi-outer 2d0 ; v[2], v[3] @5q-inner 3d0 @5phi-inner 4d0) ; v[4], v[5] (+ @5q-outer @5phi-outer @5q-inner @5phi-inner)))) ;; ⇒ 10.0d0