Макрос for lisp

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

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

Как переписать макрос без использования do, loop, а только с использованием хвостовой рекурсии?
Листинг программы
  1. (defmacro for ((parameter start-value end-value step) &body body)
  2. (let ((gstop (gensym)))
  3. `(do ((,parameter, start-value (+ ,step ,parameter))
  4. (,gstop ,end-value))
  5. ((> ,parameter ,gstop))
  6. ,@body)))

Решение задачи: «Макрос for lisp»

textual
Листинг программы
  1. ; in: FOR (X 1 8 1)
  2. ;     (FOR (X 1 8 1)
  3. ;       (PRINC X))
  4. ; --> PROGN LABELS BLOCK
  5. ; ==>
  6. ;   (LET ((SETQ X K))
  7. ;     (IF (> X 8)
  8. ;         VAL
  9. ;         (#:G613 (VAL (+ X 1)))))
  10. ;
  11. ; caught ERROR:
  12. ;   The LET binding spec (SETQ X K) is malformed.
  13.  
  14. ; --> PROGN
  15. ; ==>
  16. ;   (LABELS ((#:G613 (VAL K)
  17. ;              (LET (#)
  18. ;                (IF #
  19. ;                    VAL
  20. ;                    #))))
  21. ;     (#:G613 (PRINC X) 1))
  22. ;
  23. ; caught STYLE-WARNING:
  24. ;   The variable VAL is defined but never used.
  25. ;
  26. ; caught STYLE-WARNING:
  27. ;   The variable K is defined but never used.
  28.  
  29. ; file: C:/Users/yananec/Downloads/task13-1.lsp
  30. ; in: FOR (X 1 8 1)
  31. ;     (PRINC X)
  32. ;
  33. ; caught WARNING:
  34. ;   undefined variable: X
  35. ;
  36. ; compilation unit finished
  37. ;   Undefined variable:
  38. ;     X
  39. ;   caught 1 ERROR condition
  40. ;   caught 1 WARNING condition
  41. ;   caught 2 STYLE-WARNING conditions

Объяснение кода листинга программы

В представленном коде есть одна строка, которая является циклом for в Lisp. Вот что делает этот код:

  1. Создает переменную X и инициализирует ее значением K.
  2. Проверяет, больше ли X 8.
  3. Если X больше 8, присваивает X значение VAL и увеличивает его на 1.
  4. Выводит значение X с помощью функции PRINC. Также есть несколько предупреждений компилятора:
  5. Переменная VAL определена, но никогда не используется.
  6. Переменная K определена, но никогда не используется.
  7. Переменная X не определена в момент использования. Итого, в данном коде допущено несколько ошибок, которые следует исправить:
  8. Исправить синтаксис определения переменной X в цикле FOR.
  9. Использовать переменную VAL или K внутри цикла FOR.
  10. Убедиться, что переменная X определена до ее использования в цикле FOR.

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


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

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

6   голосов , оценка 3.833 из 5

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

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

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