Задача: Реализовать операции работы с множествами:
A⋃B={x|x∊A или x∊B}
Пересечением множеств A и B называется множество
A⋂B={x|x∊A и x∊B}
Разностью множеств A и B называется множество
A\B={x|x∊A и x∉B}
Симметрической разностью множеств A и B называется множество
A-B=(A\B)⋃(B\A)
Для удобства и понятности создаётся класс multitude.
('multitude defclass) ('multitude defvar list) ('multitude defmethod list () list) ('multitude defmethod multitude (x) (nil setq list (nil if ((nil type-of x) = 'multitude) (x list) x))) ('multitude defmethod push (x) (nil setq list (nil cons x list))) ('multitude defmethod contain (x) (nil let (found) (nil try (list for i (nil if (x = i) (nil throw 'break))) break (nil setq found true)) found)) ('multitude defmethod ⋃ (m) (nil let ((union ('multitude newobject m))) (list for* x (nil if (nil not (union contain x)) (union push x))) union)) ('multitude defmethod ⋂ (m) (nil let ((inter ('multitude newobject)) (lockinter ('lock newobject))) (list for x (nil if (m contain x) (lockinter progn (inter push x)))) inter)) ('multitude defmethod \ (m) (nil let ((diff ('multitude newobject)) (lockdiff ('lock newobject))) (list for x (nil if (nil not (m contain x)) (lockdiff progn (diff push x)))) diff)) ('multitude defmethod - (m) (nil let ((a (this \ m)) (b (m \ this))) (a ⋃ b)))
Конструктор может принимать аргумент как список или множество.
Функция contain использует параллельность. Выход из параллельного цикла реализован с помощью исключения.
Функция ⋃ реализует последовательный алгоритм. В данной задаче параллельность недоступна.
В функция ⋂ может параллельно контролировать нахождение элементов используя функцию contain. Но изменение результата inter защищена замком lockinter.
Аналогично реализована функция \.
В функции - параллельность достигается в вычислении переменных a и b.