Определить макрос для цикла repeat - Lisp

Узнай цену своей работы

Формулировка задачи:

Определите макрос для цикла repeat, реализующий итерационный процесс через вызов функции с хвостовой рекурсией. Формат команды для вызова макроса: (repeat (body) condition) где body — тело цикла — одно или несколько выражений; condition — условие окончания цикла; Тело цикла должно исполняться до тех пор, пока результат вычисления условия не станет отличным от NIL. Результат выполнения макроса — значение последнего выражения в теле body. Нужно реализовать, без использования loop.
(defmacro repeat ((expr &rest body) condition)
  (let ((func-name (gensym)))
    `(labels ((,func-name (val)
                (let ((,result (progn ,expr ,@body)))
                  (if ,condition
                      ,result
                      func-name val))))
       (,func-name ,expr))))
это моя идея, но она не работает, помогите...))))

Решение задачи: «Определить макрос для цикла repeat»

textual
Листинг программы
(defmacro repeat ((&body body) condition)
  (let ((n (gensym)) (name (gensym)))
    `(labels ((,name (,n)
                (if ,condition
                    ,n
                    (,name (progn ,@body)))))
       (,name ()))))
 
USER> (let ((i 0))
       (repeat ((format t "~A " i) 
                (incf i))
         (> i 1)))
0 1 
2
USER> (let ((i 0))
       (repeat ((incf i)
                (format t "~A " i))
         (> i 1)))
1 2 
NIL

Оцени полезность:

11   голосов , оценка 3.818 из 5
Похожие ответы