Pri implementácií si
treba uvedomiť, že prázdny zoznam NIL nepočítame ako atóm.
Pre zjednodušenie použijeme viacero funkcií.
Možným riešením je, že hlavná funkcia (POCITAJ-ATOMY) zavolá funkciu, ktorá vykoná požadovanú úlohu pre prvky vľavo (vlavo) a funkciu, ktorá ju vykoná pre prvky vpravo od význačného prvku (vpravo).
Funkcia vlavo
zistí počet prvkov vľavo od význačného na hornej úrovni v
zozname a rekurzívne to isté pre všetky podzoznamy tohto
zoznamu. Ak na danej úrovni nie je význačný prvok vracia, pre
danú úroveň 0.
Pri tejto funkcii je výhodné použiť pomocný argument.
Pretože ak pri hľadaní na danej úrovni nenájdeme význačný
prvok, narazíme teda na koniec zoznamu, máme možnosť vrátiť
počet=0.
Podobne funkcia vpravo
zistí počet prvkov vpravo od význačného na hornej úrovni v
zozname a rekurzívne to isté pre všetky podzoznamy tohto
zoznamu. Ak na danej úrovni nie je význačný prvok vracia, pre
danú úroveň 0.
Funkcia na danej úrovni vždy hľadá význačný prvok, a ak ho
nájde spočíta atómy na danej úrovni za ním. Pričom, ale
pokračuje v ďalšom hľadaní pre podzoznamy na danej úrovni.
; Na počítanie prvkov môžeme použiť funkciu sucet.
; Počíta len atómy (NIL nie).
; (sucet '(1 () x a)) -> 3
(defun sucet (zoz)
(cond ((NULL zoz) 0)
((NULL (first zoz)) (sucet (rest zoz)))
((ATOM (first zoz)) (+ 1 (sucet (rest zoz))))
(T (sucet (rest zoz)))
)
)
; Ak prvok na danej úrovni nenájde vráti pre danú úroveň 0.
; Počíta len atómy (NIL nie).
(defun vlavo (zoz prv poc)
(cond ((NULL zoz) 0)
((equal prv (first zoz)) (+ poc (vlavo (rest zoz) prv 0)))
((NULL (first zoz)) (vlavo (rest zoz) prv poc))
((ATOM (first zoz)) (vlavo (rest zoz) prv (+ poc 1)))
(T (+ (vlavo (first zoz) prv 0) (vlavo (rest zoz) prv poc))))
)
)
; Príklady:
(vlavo '((1 2 x 1)) 'x 0) ; -> 2
(vlavo '(x (1 x)) 'x 0) ; -> 1
(vlavo '(1 (2 3 x) x 4 5) 'x 0) ; -> 3
; Ak prvok na danej úrovni nenájde vráti pre danú úroveň 0.
; Počíta len atómy (NIL nie).
(defun vpravo (zoz prv)
(cond ((ATOM zoz) 0)
((equal prv (first zoz)) (+ (sucet (rest zoz)) (vpravo (rest zoz) prv)))
(T (+ (vpravo (first zoz) prv) (vpravo (rest zoz) prv)))
)
)
; Príklad:
(vpravo '(x (x 1)) 'x) ; -> 1
(vpravo '((1 x 1 2)) 'x) ; -> 2
(vpravo '(4 (5 6 x 1 (x)) x 2) 'x) ; -> 2
; Hlavná funkcia.
(defun POCITAJ-ATOMY (sv prv)
(list (vlavo sv prv 0) (vpravo sv prv))
)
; Príklady:
(POCITAJ-ATOMY '((1 x 1)(x (2 x 2 3))(4 5)) 'x) ; -> (2 3)
(POCITAJ-ATOMY '((x (x) 1 2)(3 4)) 'x) ; -> (0 2)