Макрос for lisp
Формулировка задачи:
Как переписать макрос без использования do, loop, а только с использованием хвостовой рекурсии?
(defmacro for ((parameter start-value end-value step) &body body) (let ((gstop (gensym))) `(do ((,parameter, start-value (+ ,step ,parameter)) (,gstop ,end-value)) ((> ,parameter ,gstop)) ,@body)))
Решение задачи: «Макрос for lisp»
textual
Листинг программы
; in: FOR (X 1 8 1) ; (FOR (X 1 8 1) ; (PRINC X)) ; --> PROGN LABELS BLOCK ; ==> ; (LET ((SETQ X K)) ; (IF (> X 8) ; VAL ; (#:G613 (VAL (+ X 1))))) ; ; caught ERROR: ; The LET binding spec (SETQ X K) is malformed. ; --> PROGN ; ==> ; (LABELS ((#:G613 (VAL K) ; (LET (#) ; (IF # ; VAL ; #)))) ; (#:G613 (PRINC X) 1)) ; ; caught STYLE-WARNING: ; The variable VAL is defined but never used. ; ; caught STYLE-WARNING: ; The variable K is defined but never used. ; file: C:/Users/yananec/Downloads/task13-1.lsp ; in: FOR (X 1 8 1) ; (PRINC X) ; ; caught WARNING: ; undefined variable: X ; ; compilation unit finished ; Undefined variable: ; X ; caught 1 ERROR condition ; caught 1 WARNING condition ; caught 2 STYLE-WARNING conditions
Объяснение кода листинга программы
В представленном коде есть одна строка, которая является циклом for в Lisp. Вот что делает этот код:
- Создает переменную
X
и инициализирует ее значениемK
. - Проверяет, больше ли
X
8. - Если
X
больше 8, присваиваетX
значениеVAL
и увеличивает его на 1. - Выводит значение
X
с помощью функцииPRINC
. Также есть несколько предупреждений компилятора: - Переменная
VAL
определена, но никогда не используется. - Переменная
K
определена, но никогда не используется. - Переменная
X
не определена в момент использования. Итого, в данном коде допущено несколько ошибок, которые следует исправить: - Исправить синтаксис определения переменной
X
в циклеFOR
. - Использовать переменную
VAL
илиK
внутри циклаFOR
. - Убедиться, что переменная
X
определена до ее использования в циклеFOR
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д