-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathsubstitute.sls
63 lines (45 loc) · 1.44 KB
/
substitute.sls
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
51
52
53
54
55
56
57
58
59
60
61
62
63
#!r6rs
(library (mpl substitute)
(export substitute
substitute-this
substitute-in
sequential-substitute
concurrent-substitute)
(import (rnrs)
(mpl match)
(mpl automatic-simplify))
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (substitute u t r)
(automatic-simplify
(cond ((equal? u t) r)
((list? u)
(map (substitute-this t r) u))
(else u))))
(define (substitute-this t r)
(lambda (u)
(substitute u t r)))
(define (substitute-in u)
(lambda (t r)
(substitute u t r)))
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (sequential-substitute u L)
(automatic-simplify
(match L
( () u )
( ( (t r) . rest )
(sequential-substitute (substitute u t r)
rest) ))))
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (concurrent-substitute u S)
(automatic-simplify
(let ((result (find (lambda (elt)
(equal? u (car elt)))
S)))
(cond ( result (list-ref result 1) )
( (list? u)
(map (lambda (elt)
(concurrent-substitute elt S))
u) )
( else u )))))
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
)