Объясните один момент, касающийся переменных - Lisp
Формулировка задачи:
Объясните пожалуйста, что такое &optional.
Я так понял, это касается перечисления переменных. В учебнике либо плохо искал, либо просто не нашел. Помогите.
В каком контексте используется, зачем и в чем выгода?
Зачем ставится знак & ?
Заранее благодарю.
Вот пример:
(defun compress (w &optional b)
(cond ((null w) nil)
((equal (car w) b) (compress (cdr w) b))
((cons (car w) (compress (cdr w) (car w))))))Решение задачи: «Объясните один момент, касающийся переменных»
textual
Листинг программы
(defun compress (w) (cond ((null (cdr w)) w) ((equal (car w) (cadr w)) (compress (cdr w))) ((cons (car w) (compress (cdr w)))))) > (compress '(a a)) (A) > (compress '(a)) (A) > (compress '()) NIL > (compress '(a b)) (A B) > (compress '(a a b c c c d e e)) (A B C D E)
Объяснение кода листинга программы
- Создана функция
compress. - В функции используется конструкция
cond, которая проверяет три условия:- Если
cdr wравенnil, то возвращаетсяw. - Если
car wравенcadr w, то возвращается результат вызова функцииcompressс аргументомcdr w. - Если
car wне равенcadr w, то возвращается результат вызова функцииcompressс аргументом(cons (car w) (compress (cdr w))).
- Если
- Возвращаемое значение функции зависит от переданного аргумента:
- Если передан
nil, то возвращаетсяnil. - Если передан один элемент, то он возвращается без изменений.
- Если передан список, то элементы списка, которые имеют одинаковые значения, объединяются в один элемент.
- Если передан
- Пример использования функции:
(compress '(a a)) -> (A)(compress '(a)) -> (A)(compress '()) -> nil(compress '(a b)) -> (A B)(compress '(a a b c c c d e e)) -> (A B C D E)