Sujet : Re: LISP PROGRAMMING
De : Nobody447095 (at) *nospam* here-nor-there.org (B. Pym)
Groupes : comp.lang.lispDate : 30. Jun 2025, 10:31:19
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <103tlh6$23i82$1@dont-email.me>
User-Agent : XanaNews/1.18.1.6
(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))))
* (odd-reverse '(0 1 2 3 4 5 6 7))
(6 1 4 3 2 5 0 7)
Gauche Scheme
;; The length of the list must be even.
(define (odd-reverse lst)
(do ((a () (cons (pop! lst) a))
(b () (cons (pop! lst) b)))
((null? lst) (append-map list a (reverse b)))))
(odd-reverse '(0 1 2 3 4 5 6 7))
===>
(6 1 4 3 2 5 0 7)