added a comment, improved error message for unresolveable adjacencies,
a sort function is now part of this module, so it can be used standing alone
This commit is contained in:
parent
a8dd2ab60b
commit
2479676e2d
37
dfs.scm
37
dfs.scm
|
@ -1,3 +1,28 @@
|
||||||
|
;;;
|
||||||
|
;;; merge(?) sort for general purpose:
|
||||||
|
;;; ==================================
|
||||||
|
;;;
|
||||||
|
;;; (sort predicate list-to-be-sorted to-sort-in-list) ---> sorted-list
|
||||||
|
;;;
|
||||||
|
;;; where
|
||||||
|
;;;
|
||||||
|
;;; predicate : (lambda (a b) ...) with a x b ---> {#t, #f}
|
||||||
|
;;; e.g. (lambda (a b) (> a b))
|
||||||
|
;;; list-to-be-sorted : e.g. '(4 2 5 1 3)
|
||||||
|
;;; to-sort-in-list : e.g. '(6)
|
||||||
|
;;;
|
||||||
|
;;; will produce the result '(6 5 4 3 2 1).
|
||||||
|
;;;
|
||||||
|
(define (sort pred todo done)
|
||||||
|
(if (null? todo)
|
||||||
|
done
|
||||||
|
(sort pred (cdr todo) (insert pred (car todo) done))))
|
||||||
|
|
||||||
|
(define (insert pred item ls)
|
||||||
|
(if (or (null? ls) (pred item (car ls)))
|
||||||
|
(cons item ls)
|
||||||
|
(cons (car ls) (insert pred item (cdr ls)))))
|
||||||
|
|
||||||
(define time 0)
|
(define time 0)
|
||||||
|
|
||||||
(define-enumerated-type color :color
|
(define-enumerated-type color :color
|
||||||
|
@ -59,7 +84,8 @@
|
||||||
;;;
|
;;;
|
||||||
;;; where
|
;;; where
|
||||||
;;;
|
;;;
|
||||||
;;; dag : '(#{:dfs} ...)
|
;;; dag : '(#{:dfs} ...) ; representation of a given
|
||||||
|
;;; directed acyclic graph)
|
||||||
;;; auto-leafs? : #t (by default) or #f
|
;;; auto-leafs? : #t (by default) or #f
|
||||||
;;; sorted-dag : the sorted dag
|
;;; sorted-dag : the sorted dag
|
||||||
;;;
|
;;;
|
||||||
|
@ -81,9 +107,9 @@
|
||||||
;; (sort pred todo-list done-list)
|
;; (sort pred todo-list done-list)
|
||||||
(sort (lambda (current position)
|
(sort (lambda (current position)
|
||||||
(< (dfs-ftime current) (dfs-ftime position)))
|
(< (dfs-ftime current) (dfs-ftime position)))
|
||||||
;;
|
;;
|
||||||
;; the result of this should be the dag with the ftimes
|
;; the result of this should be the dag with the ftimes
|
||||||
;;
|
;;
|
||||||
(let for-all-nodes ((node-name (car node-names))
|
(let for-all-nodes ((node-name (car node-names))
|
||||||
(nodes-to-do (cdr node-names))
|
(nodes-to-do (cdr node-names))
|
||||||
(current-dag dag))
|
(current-dag dag))
|
||||||
|
@ -131,7 +157,8 @@
|
||||||
(color white) 0 #f)))
|
(color white) 0 #f)))
|
||||||
(set! current-dag (dfs-visit (cons leaf current-dag)
|
(set! current-dag (dfs-visit (cons leaf current-dag)
|
||||||
leaf auto-leafs?)))
|
leaf auto-leafs?)))
|
||||||
(error "dfs-visit: incomplete dag!"))))
|
(error "dfs-visit: unresolveable adjacency: "
|
||||||
|
current-adj))))
|
||||||
(if (not (null? todo-adjs))
|
(if (not (null? todo-adjs))
|
||||||
(for-all-adjs (car todo-adjs) (cdr todo-adjs)))))
|
(for-all-adjs (car todo-adjs) (cdr todo-adjs)))))
|
||||||
(set! time (+ time 1))
|
(set! time (+ time 1))
|
||||||
|
|
Loading…
Reference in New Issue