День добрый! Можете прокомментировать код программы на Лиспе - 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)

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


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

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

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