# Pastebin Qq2cyT4v (defmacro with-cpring6 ((cpinternals cpindex) &body body) "Expose two SETF-able symbol-macros inside BODY: @6q ⇔ (aref CPINTERNALS CPINDEX) @6theta ⇔ (aref CPINTERNALS (+ 1 CPINDEX) @6phi ⇔ (aref CPINTERNALS (+ 2 CPINDEX))" (let ((vec (gensym "VEC-")) (idx (gensym "IDX-"))) `(let ((,vec ,cpinternals) (,idx ,cpindex)) (symbol-macrolet ((@6q (aref ,vec ,idx)) (@6theta (aref ,vec (+ 1 ,idx))) (@6phi (aref ,vec (+ 2 ,idx))) ) ,@body)))) ;;; The old way of extracting the parameters (defun extract-ring6-cps-old (cpinternals cpindex) (values (aref cpinternals cpindex) ; q (aref cpinternals (+ 1 cpindex)) ; theta (aref cpinternals (+ 2 cpindex)))) ; phi ;;; The more readable and more future proof (defun extract-ring6-cps (cpinternals cpindex) (with-cpring6 (cpinternals cpindex) (values @6q @6theta @6phi)))