Макрос 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. - Проверяет, больше ли
X8. - Если
Xбольше 8, присваиваетXзначениеVALи увеличивает его на 1. - Выводит значение
Xс помощью функцииPRINC. Также есть несколько предупреждений компилятора: - Переменная
VALопределена, но никогда не используется. - Переменная
Kопределена, но никогда не используется. - Переменная
Xне определена в момент использования. Итого, в данном коде допущено несколько ошибок, которые следует исправить: - Исправить синтаксис определения переменной
Xв циклеFOR. - Использовать переменную
VALилиKвнутри циклаFOR. - Убедиться, что переменная
Xопределена до ее использования в циклеFOR.