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

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

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

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

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

textual
Листинг программы
  1. (defmacro repeat ((&body body) condition)
  2.   (let ((n (gensym)) (name (gensym)))
  3.     `(labels ((,name (,n)
  4.                 (if ,condition
  5.                     ,n
  6.                     (,name (progn ,@body)))))
  7.        (,name ()))))
  8.  
  9. USER> (let ((i 0))
  10.        (repeat ((format t "~A " i)
  11.                 (incf i))
  12.          (> i 1)))
  13. 0 1
  14. 2
  15. USER> (let ((i 0))
  16.        (repeat ((incf i)
  17.                 (format t "~A " i))
  18.          (> i 1)))
  19. 1 2
  20. NIL

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

11   голосов , оценка 3.818 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы