Новая синтаксическая форма с макросами и функционалами - 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.