Search and add to a list in Scheme -
i want search element in list, 1 (it's list of lists)
(name1 (name2 (name3 name4) (name5 (name6))) (name7 (name8 name9)) (name10 (name11 name12)) (name13))
and when find element want add it. search name10
, add new name name11
, name12
group. appreciated!
(define (adder name2badded indexname treenode) (display treenode) (newline) (cond ((null? treenode)#f) ;"tree null")) ((pair? treenode) (if (adder name2badded indexname (car treenode)) (display "gotcha!") (adder name2badded indexname (cdr treenode)) ) ) ;end pair? (else (eq? indexname treenode) );end else );end cond )
this have far, find spot want add can't adding spot.
you must reconstruct new tree on way found point, after you've added new value there. must stop 1 level above you're stopping now: @ (name old-value ...)
instead of @ name
. means must test equality (car treenode)
, not treenode
itself. way you'll able construct new association group as
(cons (car treenode) (cons val2add (cdr treenode)))
and need alter recursion structure use new updated assoc group instead of old one, reconstruct whole tree on way back:
(define (add-into val2add name tree) (if (pair? tree) (if (eqv? name (car tree)) (cons name (cons val2add (cdr tree))) ; found! (cons (add-into val2add name (car tree)) ; it's in car or in cdr, (add-into val2add name (cdr tree)))) ; or maybe in both? tree))
but if tree assoc list , allowed use surgical routines, use
(define (add-into! val2add name als) (cond ((assv name als) => (lambda (a) (set-cdr! (cons val2add (cdr a)))))))
Comments
Post a Comment