День добрый! Можете прокомментировать код программы на Лиспе - 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)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д