День добрый! Можете прокомментировать код программы на Лиспе - Lisp
Формулировка задачи:
Помогите разобраться в коде)
Множества заданы списками строк L1 и L2. Получить в виде списка L3 множество L1\L2.
Код программы:
(defun foo (&rest sets)
(let ((rests (rest sets)))
(loop for i in (first sets)
when (not (remove
nil
(mapcar
#'(lambda (s) (member i s))
rests)))
collect i)))
(foo '(1 2 3 4) '(3 4) '(4 5))Решение задачи: «День добрый! Можете прокомментировать код программы на Лиспе»
textual
Листинг программы
(defun foo (&rest sets)
;;&rest говорит о том дальше идет неогранниченное количество аргументов для функции,
;;и доступ к этим аргументам будет через переменную sets
;;В случае (foo '(1 2 3 4) '(3 4) '(4 5)) -> sets = '((1 2 3 4) (3 4) (4 5))
(let ((rests (rest sets)))
;;создаем локальную переменную rests которая равна хвосту списка sets -> rests = '((3 4) (4 5))
(loop for i in (first sets)
;;Цикл в котором переменной i присваиваем значения головы списка sets -> i = 1, i =2, i = 3, i = 4
;;Для Java это for(Integer i : sets[0]) {}
when (not (remove nil (mapcar #'(lambda (s) (member i s)) rests))) collect i)))
;;when то же самое что if
;;Грубо говоря, если неправда то что в остальных списках (из которых удаляем все nil) нет элементов то накапливаем i
;;затем возвращаем накопленное значение
;; otevet: (1 2)