nested alists added by mario-goulart on Sun Feb 17 13:39:05 2013

(define file-tree
  '((foo (perms . 755)
         (owner . mario)
         (group . users)
         (content (foo2
                   (perms . 644)
                   (owner . mario)
                   (group . users))))
    (bar (perms . 755)
         (owner . mario)
         (group . nobody)
         (content (bar2
                   (perms . 644)
                   (owner . mario)
                   (group . nobody)
                   (content (bar21
                             (perms . 644)
                             (owner . foo)
                             (group . foo)
                             (content (bar211
                                       (perms . 644)
                                       (owner . bar)
                                       (group . foo))))))
                  (bar3
                   (perms . 777)
                   (owner . mario)
                   (group . nobody))))))


(define (aref alist path) ;; not CL
  (let loop ((path path)
             (alist alist))
    (if (null? (cdr path))
        (alist-ref (car path) alist)
        (and-let* ((v (alist-ref (car path) alist)))
          (loop (cdr path) v)))))

(define (aset! alist path value)
  (let loop ((path path)
             (alist alist))
    (if (null? (cdr path))
        (begin
          (set! alist (alist-update! (car path) value alist))
          alist)
        (and-let* ((v (alist-ref (car path) alist)))
          (loop (cdr path) v)))))
  


(pp (aref file-tree '(bar content bar2 content bar21 content bar211 owner)))

(aset! file-tree '(bar content bar2 content bar21 content bar211 owner) 'somebody)

(pp (aref file-tree '(bar content bar2 content bar21 content bar211 owner)))