Обьясните код... - Lisp
Формулировка задачи:
Что такое "pred" в этом коде?
(defun partition (pred list)
(list (remove-if-not pred list)
(remove-if pred list)))
(defun partition-by-sign (list)
(partition #'(lambda (x) (>= x 0))
list))Решение задачи: «Обьясните код...»
textual
Листинг программы
(defun break-into-odds-evens (w) (if w (reduce #'(lambda (odds evens) `(,(cons (car w) evens) ,odds)) (break-into-odds-evens (cdr w))) `(nil nil))) > (break-into-odds-evens '(a 1 b 2 c 3)) ((A B C) (1 2 3))
Объяснение кода листинга программы
В данном коде представлена функция break-into-odds-evens, которая принимает один аргумент w. Если w не равно nil, то возвращает результат работы функции reduce.
Функция reduce принимает два аргумента: odds и evens.
В теле функции reduce происходит следующее:
(cons (car w) evens)— из первого элементаwсоздается новый списокodds, а из оставшейся части спискаwсоздается новый списокevens.(,odds, evens)— полученные спискиoddsиevensобъединяются в один список, который возвращается в качестве результата. Если жеwравноnil, то рекурсивно вызывается функцияbreak-into-odds-evensдляcdrаргументаw. В конце функцииbreak-into-odds-evensвозвращается списокnil, что означает успешное завершение работы функции. Пример использования функцииbreak-into-odds-evensс аргументом'(a 1 b 2 c 3)'возвращает список((A B C) (1 2 3)), что означает успешное разделение списка на список четных и нечетных элементов.