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