Новая синтаксическая форма с макросами и функционалами - Lisp
Формулировка задачи:
Решение задачи: «Новая синтаксическая форма с макросами и функционалами»
- (defmacro если (test &rest r)
- (let* ((hp (gensym 'h))
- (tp (gensym 't))
- (hp (car r))
- (tp (cdr r)))
- `(cond (,test ,hp)
- (t ,@tp))))
- ==> если
- (если (> 5 6) '* (+ 8 9))
- ==> 17
- (если (< 5 6) '* (+ 8 9))
- ==> *
- (если (> 5 6) '* (printline 1) (printline 2) (printline 3))
- 1
- 2
- 3
- ==> 3
- (если (< 5 6) '* (printline 1) (printline 2) (printline 3))
- ==> *
Объяснение кода листинга программы
В данном коде определён макрос если
с помощью которого можно создавать условные выражения. Макрос принимает на вход тестирующую форму (тест) и любое количество аргументов (r), которые представляются в виде списка.
Внутри макроса создаются две временные переменные hp
и tp
, которые используются для хранения условной и альтернативной ветвей.
Если тест истинен, то возвращается значение hp
, иначе возвращается значение tp
.
В качестве примера использования данного макроса, можно рассмотреть следующий код:
(если (> 5 6) ' (+ 8 9))
В данном случае, так как условие (> 5 6)
истинно, то возвращается значение 17
.
А в этом примере:
(если (< 5 6) ' (+ 8 9))
условие (< 5 6)
ложно, поэтому возвращается значение *
.
И в этом примере:
(если (> 5 6) ' (printline 1) (printline 2) (printline 3))
1
2
3
условие (> 5 6)
истинно, поэтому выводится значение 1
, иначе выводятся значения 2
и 3
.
А в этом примере:
(если (< 5 6) ' (printline 1) (printline 2) (printline 3))
условие (< 5 6)
ложно, поэтому выводится значение *
, иначе выводятся значения 2
и 3
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д