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