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)))