Что такое &optional? - Lisp

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

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

Можете объяснить? Вот пример:
(defun subdepth (item mlist &optional (mdepth 0)) (cond((null mlist) nil) ((eql item mlist) mdepth) ((atom mlist) mlist) (t (cons (subdepth item (car mlist) (+ 1 mdepth)) (subdepth item (cdr mlist) mdepth)))))

Решение задачи: «Что такое &optional?»

textual
Листинг программы
(defun sub-depth (item mlist &optional (mdepth 0))
  (cond((null mlist) nil)
       ((eql item mlist) mdepth)
       ((atom mlist) mlist)
       (t (cons (sub-depth item (car mlist) (+ 1 mdepth))
                (sub-depth item (cdr mlist) mdepth)))))
 
> (sub-depth 'c '(a (b (c) d) e))
(A (B (3) D) E)

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

В этом коде определён встроенный процессор Lisp, который называется sub-depth. Он принимает три аргумента: item, mlist и mdepth. Аргумент mdepth является необязательным и по умолчанию установлен на 0. В функции используется cond для проверки трёх условий:

  1. Если mlist равно nil, то возвращается nil. Это конечный результат, если item является корнем списка.
  2. Если item равно mlist, то возвращается mdepth. Это значит, что item является листом списка.
  3. Если mlist является атомом (не является списком), то возвращается mlist. Это базовый случай, когда функция рекурсивно вызывается для car и cdr mlist.
  4. В противном случае функция рекурсивно вызывается для car и cdr mlist, а результат этого вызова добавляется в новый список, который затем возвращается. В приведенном примере функция вызывается с аргументами 'c', '(a (b (c) d) e' и 0. Сначала функция проверяет, является ли mlist корнем. Это не так, поэтому она переходит ко второму условию cond. Там она видит, что item равно mlist, поэтому возвращает 0. Затем функция вызывается снова с аргументами 'c', '(a (b (c) d) e' и 1. На этот раз функция проверяет, является ли mlist атомом. Это не так, поэтому она переходит к третьему условию cond. Там она видит, что item не равен mlist, поэтому функция вызывается снова с аргументами 'c', '(a (b (c) d) e' и 2. На этот раз функция проверяет, является ли mlist списком. Это так, поэтому она возвращает новый список, состоящий из car и cdr mlist. Конечный результат этого вызова — (A (B (3) D) E).

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


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

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

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