diff --git a/dfs.scm b/dfs.scm index 8f0d552..be06d96 100644 --- a/dfs.scm +++ b/dfs.scm @@ -70,9 +70,9 @@ (define (dfs->list dfs-node) (list (dfs-name dfs-node) (dfs-adjacencies dfs-node) (dfs-ignored dfs-node))) -(define (dfs-lookup-node node-name dag) +(define (dfs-lookup-node pred node-name dag) (find (lambda (candidate) - (string=? (dfs-name candidate) node-name)) + (pred (dfs-name candidate) node-name)) dag)) ;;; @@ -100,7 +100,8 @@ ;;; unresolveable in the list of all node-names. ;;; (define (dfs dag . maybe-arg) - (let-optionals maybe-arg ((auto-leafs? #t)) + (let-optionals maybe-arg ((pred string=?) + (auto-leafs? #t)) (set! time 0) (let ((node-names (map dfs-name dag))) (if (not (null? node-names)) @@ -113,11 +114,11 @@ (let for-all-nodes ((node-name (car node-names)) (nodes-to-do (cdr node-names)) (current-dag dag)) - (let ((current-node (dfs-lookup-node node-name current-dag))) + (let ((current-node (dfs-lookup-node pred node-name current-dag))) (cond ((eq? (dfs-color current-node) (color white)) - (let ((new-dag (dfs-visit current-dag - current-node auto-leafs?))) + (let ((new-dag (dfs-visit current-dag current-node + pred auto-leafs?))) (if (not (null? nodes-to-do)) (for-all-nodes (car nodes-to-do) (cdr nodes-to-do) @@ -131,7 +132,7 @@ '()) node-names)))) -(define (dfs-visit dag node auto-leafs?) +(define (dfs-visit dag node pred auto-leafs?) ;; (dfs-dag-show dag node) (let ((name (dfs-name node)) (adjs (dfs-adjacencies node)) @@ -142,12 +143,12 @@ (if (not (null? adjs)) (let for-all-adjs ((current-adj (car adjs)) (todo-adjs (cdr adjs))) - (let ((maybe-node (dfs-lookup-node current-adj current-dag))) + (let ((maybe-node (dfs-lookup-node pred current-adj current-dag))) (if maybe-node (begin (if (eq? (dfs-color maybe-node) (color white)) - (let ((next-dag (dfs-visit current-dag - maybe-node auto-leafs?))) + (let ((next-dag (dfs-visit current-dag maybe-node + pred auto-leafs?))) (set! current-dag next-dag)) (if (eq? (dfs-color maybe-node) (color grey)) (error "dfs-visit: cycle detected; node-name: " @@ -155,8 +156,8 @@ (if auto-leafs? (let ((leaf (really-make-dfs current-adj '() (color white) 0 #f))) - (set! current-dag (dfs-visit (cons leaf current-dag) - leaf auto-leafs?))) + (set! current-dag (dfs-visit (cons leaf current-dag) leaf + pred auto-leafs?))) (error "dfs-visit: unresolveable adjacency: " current-adj)))) (if (not (null? todo-adjs))