Объясните как работает &optional на примере - Lisp
Формулировка задачи:
Объясните пожалуйста как работает здесь опшионал: у него здесь при каждом рекурсивном обращении в f присваивается хвост списка? Обрабатываемый список записывается на протяжении всей программы записывается в F, и потом его же программа возвращает по завершении?
Помогите разобраться)
(defun task (lst a x &optional (f (cdr lst)))
(cond ((null lst) nil)
((eq (car lst) a) (rplacd f (cons x (cdr lst))) (task (cddr lst) a x (cdr lst)))
(t (task (cdr lst) a x (cdr lst)))))
==> task
(setq *z* '(1 2 3 4 2 5 2))
==> (1 2 3 4 2 5 2)
(task *z* 2 '!)
==> NIL
*z*
==> (1 2 ! 3 4 2 ! 5 2 !)Решение задачи: «Объясните как работает &optional на примере»
textual
Листинг программы
(defun i-sumlist (lst s) (if (null lst) s (i-sumlist (cdr lst) (+ s (car lst)))) ;; в накопительном параметре накапливается сумма (defun sumlist(lst) (i-sumlist lst 0))
Объяснение кода листинга программы
(defun i-sumlist (lst s) ...)— определение функцииi-sumlist(if (null lst) s (i-sumlist (cdr lst) (+ s (car lst))))— основной оператор if, проверяет условие(null lst), если оно истинно, то возвращаетs, иначе рекурсивно вызывает функциюi-sumlistс аргументами(cdr lst)и(+ s (car lst)), гдеcar lst— первый элемент спискаlst, аcdr lst— все остальные элементы списка, начиная со второго.(defun sumlist(lst) (i-sumlist lst 0))— определение функцииsumlist, которая является оберткой для функцииi-sumlistи принимает списокlstи начальное значение суммы0в качестве аргументов.(i-sumlist lst 0)— вызов функцииi-sumlistс аргументамиlstи0.