Lisp списки , разбиение на два списка
Формулировка задачи:
(mapcan #'(lambda (x) (if (> x 0) (list x)))
(mapcan #'(lambda (x) (if (< x 0) (list x)))
Решение задачи: «Lisp списки , разбиение на два списка»
(defun partition (w) `(,(remove-if-not #'minusp w) ,(remove-if-not #'plusp w))) > (partition '(-2 -1 0 1 2)) ((-2 -1) (1 2))
Объяснение кода листинга программы
В данном коде определённая функция partition, которая принимает один аргумент w. В этой функции используется два выражения со скобками, которые обозначают список.
В первом выражении со скобками (remove-if-not #'minusp w) происходит удаление всех элементов из списка w, которые не удовлетворяют условию minusp. То есть, возвращается список, содержащий только те элементы из w, которые меньше нуля.
Во втором выражении со скобками (remove-if-not #'plusp w) происходит удаление всех элементов из списка w, которые не удовлетворяют условию plusp. То есть, возвращается список, содержащий только те элементы из w, которые больше или равны нулю.
В результате выполнения функции partition с аргументом w, равным (-2 -1 0 1 2), возвращается список ((-2 -1) (1 2)). Это значит, что функция разбила список w на два списка: (-2 -1) и (1 2). Первый список содержит элементы, меньшие нуля, а второй список содержит элементы, большие или равные нулю.