Základom môže byť
všeobecná schéma spracovania na ľubovolnej úrovni.
Výsledkom má byť jednoduchý zoznam (množina) atómov.
Predpokladáme, že NIL je prázdny zoznam a nechápeme ho tu ako
atóm.
Pri vytváraní výsledného zoznamu môžme použiť funkciu myappend, ktorá zlúči 2 zoznamy tak, že výsledný nebude obsahovať viacnásobný výskyt atómov.
(defun myappend (zoz1 zoz2)
(append (vyhod zoz1 zoz2) zoz2)
)
; Príklad:
(myappend '(1 X 2 Y 3) '(1 2 3 Z)) ; -> (X Y 1 2 3 Z)
; Vyhod sa použije v myappend. Vyhodí zo zoz1 všetky prvky čo sú v zoz2.
(defun vyhod (zoz1 zoz2)
(cond ((null zoz1) NIL)
((isin (first zoz1) zoz2) (vyhod (rest zoz1) zoz2))
(T (cons (first zoz1) (vyhod (rest zoz1) zoz2)))
)
)
; Isin vráti T, ak sa prvok nachádza v zozname (používa sa vo funkcii vyhod).
(defun isin (p zoz)
(cond ((null zoz) NIL)
((equal p (first zoz)) T)
(T (isin p (rest zoz)))
)
)
; Hlavná funkcia.
(defun atomy (sv)
(cond ((NULL sv) NIL)
((ATOM sv) (cons sv NIL))
(T (myappend (atomy (first sv)) (atomy (rest sv))))
)
)
; Príklady:
(atomy '(1 2 (1 1 (2 1) 1 1))) ; -> (2 1)
(atomy '(1 2 (1 (3 X) ((1) X)))) ; -> (2 3 1 X)