Определить макрос для цикла 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