;This function takes a list of arbitrary levels ;as its argument. ;The function recurses through all levels of the list ;and returns a list of all unique atoms present in the ;original list. (define extractUniqueAtoms (lambda (mylist) ;In the recursive calls to extractUniqueAtoms_recurse ;All unique atoms found are added into atomList which ;ultimately is the return value of this function. (define atomList '()) (define extractUniqueAtoms_recurse (lambda (mylist) (cond ((null? mylist) #t) ((atom? (car mylist)) (if (eq? (memq (car mylist) atomList) #f) (set! atomList (cons (car mylist) atomList)) ) (extractUniqueAtoms_recurse (cdr mylist)) ) ((list? (car mylist)) (extractUniqueAtoms_recurse (car mylist)) (extractUniqueAtoms_recurse (cdr mylist)) ) ) ) ) (extractUniqueAtoms_recurse mylist) (reverse atomList) ) ) ;============== Unit Tests ====================== (load "atom.scm") (load "test.scm") (define msg "extractUniqueAtoms") (test msg (extractUniqueAtoms '(a b c d)) '(a b c d)) (test msg (extractUniqueAtoms '(a a a a)) '(a)) (test msg (extractUniqueAtoms '(a (b) c d)) '(a b c d)) (test msg (extractUniqueAtoms '(a (b) c b)) '(a b c)) (test msg (extractUniqueAtoms '(a () c d)) '(a c d)) (test msg (extractUniqueAtoms '(a (a) (c (x y) d) z)) '(a c x y d z))