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