Задача: Реализовать операции работы с множествами:
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.