Определить макрос для цикла 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д