-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtree.arc
More file actions
38 lines (32 loc) · 879 Bytes
/
tree.arc
File metadata and controls
38 lines (32 loc) · 879 Bytes
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
; different ways to navigate trees
(def tree (x)
(annotate 'tree x))
(defextend walk (seq f) (isa seq 'tree)
(let x rep.seq
(f x)
(when (acons x)
(walk (tree car.x) f)
(walk (tree cdr.x) f))))
(defextend map (f seq) (isa seq 'tree)
(withs (old rep.seq
new f.old)
(if (or (~acons old) (~is old new))
new
(cons (map f (tree car.old))
(map f (tree cdr.old))))))
(def leaves (x)
(annotate 'leaves x))
(defextend walk (seq f) (isa seq 'leaves)
(let x rep.seq
(if (~acons x)
(f x)
(do (walk (leaves car.x) f)
(walk (leaves cdr.x) f)))))
(defextend reduce (f base seq) (isa seq 'leaves)
(let x rep.seq
(if (~acons x)
base
(f (reduce f base (leaves car.x))
(reduce f base (leaves cdr.x))))))
(defextend counts (seq) (isa seq 'leaves)
(counts:flat rep.seq))