(defun odd-reverse (list)
(let ((result
(loop for (odd even) on list by #'cddr
collect odd into odds
collect even into evens
finally (return (loop for odd in (reverse odds)
for even in evens
collect odd
collect even)))))
(subseq result 0 (list-length list))))
Another viewpoint:
(defun reverse-odd-elems (list)
(loop with v = (coerce list 'simple-vector)
with len = (length list)
with odd-len = (if (evenp len) len (1- len))
for i from 0 upto (floor odd-len 2)
when (oddp i) do (rotatef (aref v i) (aref v (- odd-len i)))
finally (return (coerce v 'list))))
(defun odd-reverse (list)
(let ((result
(loop for (odd even) on list by #'cddr
collect odd into odds
collect even into evens
finally (return (loop for odd in (reverse odds)
for even in evens
collect odd
collect even)))))
(subseq result 0 (list-length list))))
Sysop: | Keyop |
---|---|
Location: | Huddersfield, West Yorkshire, UK |
Users: | 307 |
Nodes: | 16 (2 / 14) |
Uptime: | 45:05:53 |
Calls: | 6,910 |
Files: | 12,376 |
Messages: | 5,429,356 |