(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))))
| Sysop: | Amessyroom |
|---|---|
| Location: | Fayetteville, NC |
| Users: | 65 |
| Nodes: | 6 (0 / 6) |
| Uptime: | 08:16:34 |
| Calls: | 862 |
| Files: | 1,311 |
| D/L today: |
2 files (6,679K bytes) |
| Messages: | 264,942 |