aboutsummaryrefslogtreecommitdiffstats
path: root/tree.scm
diff options
context:
space:
mode:
authorSteve Langasek <vorlon@debian.org>2005-01-10 08:53:33 +0000
committerBryan Newbold <bnewbold@robocracy.org>2017-02-20 00:05:30 -0800
commite33f9eb9cf5cc29c36ce2aa7e10cd0f37ae0cc8e (patch)
treeabbf06041619e445f9d0b772b0d58132009d8234 /tree.scm
parentf559c149c83da84d0b1c285f0298c84aec564af9 (diff)
parent8466d8cfa486fb30d1755c4261b781135083787b (diff)
downloadslib-e33f9eb9cf5cc29c36ce2aa7e10cd0f37ae0cc8e.tar.gz
slib-e33f9eb9cf5cc29c36ce2aa7e10cd0f37ae0cc8e.zip
Import Debian changes 3a1-4.2debian/3a1-4.2
slib (3a1-4.2) unstable; urgency=low * Non-maintainer upload. * Add guile.init.local for use within the build dir, since otherwise we have an (earlier unnoticed) circular build-dep due to a difference between scm and guile. slib (3a1-4.1) unstable; urgency=low * Non-maintainer upload. * Build-depend on guile-1.6 instead of scm, since the new version of scm is wedged in unstable (closes: #281809). slib (3a1-4) unstable; urgency=low * Also check for expected creation on slibcat. (Closes: #240096) slib (3a1-3) unstable; urgency=low * Also check for /usr/share/guile/1.6/slib before installing for guile 1.6. (Closes: #239267) slib (3a1-2) unstable; urgency=low * Add format.scm back into slib until gnucash stops using it. * Call guile-1.6 new-catalog (Closes: #238231) slib (3a1-1) unstable; urgency=low * New upstream release * Remove Info section from doc-base file (Closes: #186950) * Remove period from end of description (linda, lintian) * html gen fixed upstream (Closes: #111778) slib (2d4-2) unstable; urgency=low * Fix url for upstream source (Closes: #144981) * Fix typo in slib.texi (enquque->enqueue) (Closes: #147475) * Add build depends. slib (2d4-1) unstable; urgency=low * New upstream. slib (2d3-1) unstable; urgency=low * New upstream. * Remove texi2html call in debian/rules. Now done upstream. Add make html instead. * Changes to rules and doc-base to conform to upstream html gen * Clean up upstream makefile to make sure it cleans up after itself.
Diffstat (limited to 'tree.scm')
-rw-r--r--tree.scm69
1 files changed, 53 insertions, 16 deletions
diff --git a/tree.scm b/tree.scm
index e9bc999..ae29a52 100644
--- a/tree.scm
+++ b/tree.scm
@@ -5,15 +5,39 @@
;; Deep copy of the tree -- new one has all new pairs. (Called
;; tree-copy in Dybvig.)
-(define (tree:copy-tree tree)
- (if (pair? tree)
- (cons (tree:copy-tree (car tree))
- (tree:copy-tree (cdr tree)))
- tree))
+
+;;@code{(require 'tree)}
+;;@ftindex tree
+;;
+;;These are operations that treat lists a representations of trees.
;; Substitute occurrences of old equal? to new in tree.
;; Similar to tree walks in SICP without the internal define.
-(define (tree:subst new old tree . equ?)
+
+;; substq and substv aren't in CL. (Names from Dybvig)
+
+;;@args new old tree
+;;@args new old tree equ?
+;;@code{subst} makes a copy of @3, substituting @1 for
+;;every subtree or leaf of @3 which is @code{equal?} to @2
+;;and returns a modified tree. The original @3 is unchanged, but
+;;may share parts with the result.
+;;
+;;@code{substq} and @code{substv} are similar, but test against @2
+;;using @code{eq?} and @code{eqv?} respectively. If @code{subst} is
+;;called with a fourth argument, @var{equ?} is the equality predicate.
+;;
+;;Examples:
+;;@lisp
+;;(substq 'tempest 'hurricane '(shakespeare wrote (the hurricane)))
+;; @result{} (shakespeare wrote (the tempest))
+;;(substq 'foo '() '(shakespeare wrote (twelfth night)))
+;; @result{} (shakespeare wrote (twelfth night . foo) . foo)
+;;(subst '(a . cons) '(old . pair)
+;; '((old . spice) ((old . shoes) old . pair) (old . pair)))
+;; @result{} ((old . spice) ((old . shoes) a . cons) (a . cons))
+;;@end lisp
+(define (subst new old tree . equ?)
(set! equ? (if (null? equ?) equal? (car equ?)))
(letrec ((walk (lambda (tree)
(cond ((equ? old tree) new)
@@ -22,16 +46,29 @@
(walk (cdr tree))))
(else tree)))))
(walk tree)))
-
-;; The next 2 aren't in CL. (Names from Dybvig)
-
-(define (tree:substq new old tree)
+(define (substq new old tree)
(tree:subst new old tree eq?))
-
-(define (tree:substv new old tree)
+(define (substv new old tree)
(tree:subst new old tree eqv?))
-(define copy-tree tree:copy-tree)
-(define subst tree:subst)
-(define substq tree:substq)
-(define substv tree:substv)
+;;@body
+;;Makes a copy of the nested list structure @1 using new pairs and
+;;returns it. All levels are copied, so that none of the pairs in the
+;;tree are @code{eq?} to the original ones -- only the leaves are.
+;;
+;;Example:
+;;@lisp
+;;(define bar '(bar))
+;;(copy-tree (list bar 'foo))
+;; @result{} ((bar) foo)
+;;(eq? bar (car (copy-tree (list bar 'foo))))
+;; @result{} #f
+;;@end lisp
+(define (copy-tree tree)
+ (if (pair? tree)
+ (cons (tree:copy-tree (car tree))
+ (tree:copy-tree (cdr tree)))
+ tree))
+
+(define tree:copy-tree copy-tree)
+(define tree:subst subst)