Функция, разбивающая список на подсписки - Lisp
Формулировка задачи:
Решение задачи: «Функция, разбивающая список на подсписки»
(define (task lst) (reverse (foldl (lambda (a b) (if (equal? a (first (first b))) (cons (cons a (first b)) (rest b)) (cons (list a) b))) (list (list (first lst))) (rest lst)))) (task '(a a a b d c d b b c)) ;'((a a a) (b) (d) (c) (d) (b b) (c)
Объяснение кода листинга программы
В коде определена функция task, которая принимает в качестве аргумента список lst.
Сначала применена функция reverse к результату вызова foldl с следующей параметрной функцией:
(lambda (a b) (if (equal? a (first (first b))) (cons (cons a (first b)) (rest b)) (cons (list a) b))
В этой функции используется условие equal? для определения, является ли первый элемент a первым элементом списка b. Если это так, то возвращается cons с двумя элементами: a и первый элемент b. В противном случае возвращается cons с одним элементом: a. Затем применяется функция cons для добавления полученного элемента в начало списка b.
Результатом применения foldl является список, который затем обрабатывается функцией reverse.
Затем результат reverse присваивается переменной task, и вызывается функция task с аргументом lst.
Результат выполнения кода:
((a a a) (b) (d) (c) (d) (b b) (c))
Это разбиение исходного списка lst на подсписки, где первый элемент каждого подсписка является уникальным.