Задача решена. Нужно переписать встроенную функцию nconc - Lisp
Формулировка задачи:
NCONC нужно написать вручную! Не пойму как
(defun exclusive(w v)
(nconc (unique w v) (unique v w)))
(defun unique (w v)
(cond ((null w) nil)
((member (car w) v) (unique (cdr w) v))
((cons (car w) (unique (cdr w) v)))))
(exclusive '(a b c) '(c d))
(a b d)Решение задачи: «Задача решена. Нужно переписать встроенную функцию nconc»
textual
Листинг программы
(DEFUN NCONC1 (X Y) (COND ((NULL X) Y) (T (RPLACD X (NCONC1 (CDR X) Y))))) (DEFUN NCONC (&REST LSTS) (COND ((NULL (CDR LSTS)) (CAR LSTS)) (T (NCONC1 (CAR LSTS) (APPLY 'NCONC (CDR LSTS))))))
Объяснение кода листинга программы
В коде есть две функции: NCONC1 и NCONC. NCONC1 - это рекурсивная функция, которая принимает два аргумента: X и Y. Если X — это NIL, то возвращается Y. Если X не является NIL, то рекурсивно вызывается NCONC1, но уже с CDR X и Y. NCONC - это функция, которая принимает любое количество аргументов (обобщённо указанных с помощью &REST LSTS). Она проверяет, является ли последний аргумент (CDR LSTS) NIL. Если это так, то возвращается первый аргумент (CAR LSTS). В противном случае, рекурсивно вызывается NCONC1 с CAR LSTS и APPLY 'NCONC с CDR LSTS. Код, который представлен, является реализацией функции concat в Scheme. Он может быть не оптимальным, поскольку использует рекурсию, а не итерацию.