Синтаксическая форма с функционалами и(или) макросами - Lisp

Узнай цену своей работы

Формулировка задачи:

Извините что создаю похожую тему, но не смог написать по примеру, потому и прошу помощи Я реализую в HomeLisp`е. Вот задание: При помощи функционалов и(или) макросов создать новую синтаксическую форму: (ИСПОЛНИТЬ_ПО_УСЛОВИИ (условие1 выражение1)(условие2 выражение2)... (условиеN выражениеN) Исполняется то выражение, условие которого возвращает Т

Решение задачи: «Синтаксическая форма с функционалами и(или) макросами»

textual
Листинг программы
;; Вспом. функция
 
(defun zip (lst)
  (cond ((null lst) nil)
        (t (cons (subseq lst 0 2) (zip (cddr lst))))))   
 
;; Макро
 
(defmacro ИСПОЛНИТЬ_ПО_УСЛОВИЮ (&rest args)
 `(cond ,@(zip args)))
 
;; Проверка
 
(исполнить_по_условию (< 5 6) '! (> 5 6) '?)
 
==> !
 
(исполнить_по_условию (> 5 6) '! (< 5 6) '?)
 
==> ?

Объяснение кода листинга программы

В коде присутствуют три элемента:

  1. Вспом. функция zip: (defun zip (lst) (cond ((null lst) nil) (t (cons (subseq lst 0 2) (zip (cddr lst))))) Данная функция рекурсивно обрабатывает каждый элемент списка lst. Если список пуст, то возвращается nil. В противном случае из списка образуется новый список, содержащий первые два элемента, и рекурсивно вызывается функция zip для оставшейся части списка.
  2. Макро ИСПОЛНИТЬ_ПО_УСЛОВИЮ: (defmacro ИСПОЛНИТЬ_ПО_УСЛОВИЮ (&rest args) `(cond ,@(zip args))) Данный макрос принимает произвольное количество аргументов args и формирует условную конструкцию в виде списка с использованием функции zip.
  3. Проверка: (исполнить_по_условию (< 5 6) '! (> 5 6) '?) В данном примере вызывается макрос ИСПОЛНИТЬ_ПО_УСЛОВИЮ с тремя аргументами: (< 5 6) - меньше ли первый элемент второго, '!' - что сделать если условие выполняется, (> 5 6) - больше ли первый элемент второго, '?' - что сделать если условие не выполняется. Возвращаемое значение: '!

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.909 из 5
Похожие ответы