Что такое &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 для проверки трёх условий:
- Если
mlistравноnil, то возвращаетсяnil. Это конечный результат, еслиitemявляется корнем списка. - Если
itemравноmlist, то возвращаетсяmdepth. Это значит, чтоitemявляется листом списка. - Если
mlistявляется атомом (не является списком), то возвращаетсяmlist. Это базовый случай, когда функция рекурсивно вызывается дляcarиcdrmlist. - В противном случае функция рекурсивно вызывается для
carиcdrmlist, а результат этого вызова добавляется в новый список, который затем возвращается. В приведенном примере функция вызывается с аргументами'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иcdrmlist. Конечный результат этого вызова —(A (B (3) D) E).