aboutsummaryrefslogtreecommitdiffstats
path: root/tree.txi
blob: ee81d1de6a68840460e08f0f03e33cb16c8bb9ac (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
@code{(require 'tree)}
@ftindex tree

These are operations that treat lists a representations of trees.


@defun subst new old tree
@defunx substq new old tree
@defunx substv new old tree


@defunx subst new old tree equ?
@code{subst} makes a copy of @var{tree}, substituting @var{new} for
every subtree or leaf of @var{tree} which is @code{equal?} to @var{old}
and returns a modified tree.  The original @var{tree} is unchanged, but
may share parts with the result.

@code{substq} and @code{substv} are similar, but test against @var{old}
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
@end defun


@defun copy-tree tree

Makes a copy of the nested list structure @var{tree} 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
@end defun